(function(){
console.log(bar);
console.log(baz);
bar = 20;
console.log(window.bar);
console.log(bar);
function baz(){
console.log("baz");
}
})()
当代码执行到"console.log(bar);"的时候,会去AO中查找"bar"。函数中的"bar"并没有通过var关键字声明,所有不会被存放在AO中。但是为什么不会去global上面去找呢?网上说这种变量是,只是给Global添加了一个属性,并不在VO中,求解释
题主问题:但是为什么不会去global上面去找呢?
回答:因为第一次执行到
这个的时候,
这个还没执行,所以上面访问会报错
这句代码执行后,才会在全局创建一个 bar,作为全局对象的属性存在,然后你才可以访问.
题主可以看下下面测试,这个,第一次执行,把上面代码注释掉,就不会报错,接着执行第二次,不注释代码,也不会报错,这是因为第一次执行的时候前面那句 bar = 20 执行过了;
题主可能还有疑问,function baz 不是也在后面么,他可以提前访问,是因为 函数声明语句和 var 变量声明会在 代码执行之前 提前到所在函数环境或全局作用域的顶部,其中 var 声明提前仅仅是 var 提前,实际赋值保留在原地,函数声明提前是全部提前,这个可以另行百度,不过推荐看经典书籍,JavaScript权威指南-第6版-中