为什么我无法访问全局范围内的声明变量



var bar = {
myName: 'bar',
printName: function () {
console.log(this.myName)
}
}
function foo() {
let myName = 'foo'
return bar.printName
}
let myName = 'outer'
let _printName = foo()
_printName()
bar.printName()

为什么第一个函数执行的结果是未定义的?我以为结果会是"outer",为什么在将let改为var后输出"outer("?这太令人困惑了,请帮帮我。

为什么第一个函数执行的结果是未定义的?

因为您没有将this绑定到函数调用中的任何内容(既没有objectThatWillBecomeThis.printName()也没有printName.call(objectThatWillBecomeThis)(。在严格模式下,这将崩溃,因为this将是undefined,而您将尝试读取undefined.myName。但是,由于您没有启用严格模式,因此遗留行为是活动的,其中this(如果未显式设置(将被设置为全局对象。但是,全局对象没有任何属性myName(在浏览器中:没有window.myName(,因此结果为undefined

为什么在将let更改为var后输出'outer'?

因为如果在全局作用域中运行此代码,任何其他作用域之外的var都将在全局对象(window.myName(上创建一个属性。let不这么做:

在程序和函数的顶级,letvar不同,不在全局对象上创建属性。例如:

var x = 'global';
let y = 'global';
console.log(this.x); // "global"
console.log(this.y); // undefined

如果你在函数内移动代码,它也不会工作,顺便说一句,因为var(或let,现在无关紧要(语句只会在函数中创建一个局部变量,而不是全局对象上的属性,所以没有办法通过任何对象的myName属性来访问它。

最新更新