JavaScript几个作用域问题
1、
var a = 0 ; function f(){ a = 1; console.log(a); //全局变量a
}
console.log(a); //全局变量a
f();
输出结果为:1 1 ,function中未声明直接赋值的a为作用域window的全局变量,很好理解
2、
var a = 0; function test(){ var a; console.log(a); //局部变量a a = 1; console.log(a); //局部变量a
}
test();
conosle.log(a); //全局变量a
输出结果为:undefined 1 0
3、
var a =0; function test(){ console.log(a); var a = 1; console.log(a); } test(); console.log(a);
输出结果为:undefined 1 0
总结:
1. JavaScript中只存在两种作用域:全局作用域window和函数作用域function,外部的function domain嵌套内部的function domain,这就是闭包原理;
2. function domain中未使用var事先声明而直接赋值或调用的变量会访问上一层作用域中的同名变量,一直到window全局domain,如果找不到则会报错;
3. var声明变量的执行优先级是最高的,所以在例子3中test()中第一次console.log(a)执行之前,已经事先执行了var a声明,但并未执行a = 1赋值,所以此时输出undefined