1.函数内部: var a = 1;//全局作用域,window对象 function test1() { console.log(a);//1 } function test2(){ var a = 2;//局部作用域 console.log(a);//2 test1(); } test2(); 结果是先打印2,再打印1,最后的结果也就是1, why? 代码最后是执行 test1 函数,先从 test1 函数内部查找是否有局部变量 a,没有变量a, 那么因为js是静态作用域,就根据书写的位置,查找上面一层的代码,也就是 a 等于 1,所以结果会打印 1。 假如js采用动态作用域呢, 执行 test1 函数时,依然是从 test1 函数内部查找是否有局部变量 a。 如果没有,就从调用函数的作用域,也就是 test2 函数内部查找 a 变量,所以结果会打印 2。 2.var有块级作用域么? { var x = 1; } // 这里可以使用 x 变量
答案是没有
let
let与var的区别就是他的作用域是局部的,块级的({}),看下面的例子
function varTest() { var x = 1; if (true) { var x = 2; // 两个x是同样的变量。这里的x和前面的x是同一个变量 console.log(x); // 2 } console.log(x); // 2 } function letTest() { let x = 1; if (true) { let x = 2; // 两个x是不同的变量,这里采用let,第二个x作用域在if这个代码块中,所以这里的x为2 console.log(x); // 2 } console.log(x); // 1 退出if的作用域,这里的x是1 } ps: { let x = 1; } // 这里不能使用 x 变量
const
不变性
const声明的为伪常量,一般是不变的。也是跟let一样的块级作用域
cnst a = 1;//必须一开始声明时就初始化 a = 2;//报错,因为const一旦声明就不能改变,且不能再次声明,