将Window
对象视为一个“巨大的闭包”,它封装了所有其他对象。现在想一想:
var ext = "test";
function myScope() {
var ext = "foo"; //new variable in myScope's scope
console.log(ext); //foo
}
function changeExt() {
ext = "bar";//ext is not defined in this scope, so JS will look in the chain of scopes and set the value to the defined var in the global scope
console.log(ext);
}
myScope();
console.log(ext); //test
changeExt();
console.log(ext); //ext has been changed by changeExt to bar
为什么会这样?因为通过使用window.property
,您试图访问window
对象的未定义属性,而不是引用未声明的var。
如果您尝试在不使用var
全局闭包中的关键字的情况下做同样的事情,您将得到相同的结果,因为它是作用域链的最后一个。
现在让我们把它想象成一个巨大的物体:
var myObj = {prop: 'defined'};
假设这myObj
是“全局对象”,如果您尝试访问prop
JS 会将您重定向到myObj.prop
(或者它会尝试这样做),如果foo
未声明属性(例如命名),您将获得您的ReferenceError
.