1、全局作用域中不带var声明变量虽然也可以但是建议带上 var声明变量,不带 var 的相当于给window对象设置一个属性罢了。
2、私有作用域(函数作用域),带 var 的是私有变量。不带 var 的是会向上级作用域查找,如果上级作用域也没有那么就一直找到 window 为止,这个查找过程叫作用域链。
3、全局作用域中使用 var 申明的变量会映射到 window 下成为属性。
1 | c = 12; |
注意
1 | var d = e = 12;//这里的e也是不带var的 |
思考
测试1
1 | console.log(a, b);//undefined, undefined |
测试2
1 | console.log(a, b);//undefined, undefined |
测试3
1 | a = 0;//window.a = 0 |
这是比较简单的一道题,需要注意的是函数内的 b 没有带 var,b 会一直向上查找到 window 下,mie发现 window 下也没有就直接给 window 设置了一个属性 window.b = ‘ceshi’,同理全局下的 a 也一样。
测试4
1 | function foo() { |
问题4和问题3的主要区别在于第一个 console.log(a) 处,因为 a 不在函数作用域内,就会向上找 window 下的作用域,发现也没有就会直接抛出引用错误 ReferenceError
经典面试题
1 | foo(); |