1、作用域
作用域用于就是变量访问性问题
-
全局作用域
- 在script其实标签到结束标签都是在全局作用域里,在函数体之外,script标签内声明的变量就是全局变量
- 全局作用域的变量可以在任何其他的作用域访问和修改
-
局部作用域
- 一个函数体就是一个新的局部作用域
- 函数内部定义的变量在局部作用域内,函数外部作用域不能访问内部作用域的变量
- 每个函数有不同的作用域,在其他函数中不可以访问(一个函数访问另一个函数的变量,通过传递参数实现)
-
var声明的变量提升:在函数作用域或者全局作用域中通过var声明的变量,不管在哪里声明,都会被当成在当前作用域的顶部声明变量,这个称之为变量提升
-
块作用域
let,const不仅仅是声明变量的区别,他们还有支持块作用域的机制,自身会产生一个块作用域(注:这里说的不是大括号、if、switch、for产生的块)
- 作用域链
- 函数作用域里面访问一个变量,先从自身开始找,如果没有,就依次往上一级作用域查找, 直到全局作用域,还是没有就报错
- 当我们处于某一个作用域里,修改某个变量值时,先修改自身作用域的值,如果没有就依次修改上一个作用域的值
-
delete:删除未声明的变量,但是不能删除已经声明的变量
let x = 1;
function fun (){
let y = 1;
}
//块作用域
if (true){
var name = "banta";
let color = "red";
const x = 1;
}
console.log(name);
console.log(color ); //会报错
console.log(x);
2、js解析顺序
- 编译(判断语法是否符合规范)
先去查找第一个作用域里面所有var,function的声明,但不赋值(var,function声明同一个变量时,函数会覆盖var) - 执行期
运行js代码,执行期里面有新的作用域,就会被激活,重新开始编译-执行,依次类推
console.log(a);
fun();
var a = 10;
function fun (){
console.log(a);
}
console.log(a); // undefined undefined 10
/*
1、编译:
var a;
function fun (){};
2、执行期
30行 --- undefined 声明变量没有赋值
31行 --- 函数自执行,产生新的作用域
1、编译
2、执行
34行 --- undefined 找到全局作用域a,声明未赋值
返回上一个作用域继续执行
32行 --- a = 10 赋值
36行 --- 10
*/