为什么我不能在全局范围内访问声明的变量
Why can't I access a declared variable in the global scope
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'?太乱了,求大神指教
Why the result of the first function execution is undefined ?
因为您没有将 this
绑定到函数调用中的任何内容(您既没有 objectThatWillBecomeThis.printName()
也没有 printName.call(objectThatWillBecomeThis)
)。在严格模式下,这会崩溃,因为 this
将是 undefined
然后你会尝试读取 undefined.myName
。但是由于您没有启用严格模式,因此遗留行为处于活动状态,其中 this
- 如果未明确设置 - 将设置为全局对象。但是,全局对象没有任何 属性 myName
(在浏览器中:没有 window.myName
)所以结果是 undefined
.
why output 'outer' after changing let to var ?
因为如果您在全局范围内 运行 此代码,任何其他范围之外的 var
将在全局对象 (window.myName
) 上创建一个 属性。 let
doesn't do that:
At the top level of programs and functions, let
, unlike var
, does not create a property on the global object. For example:
var x = 'global';
let y = 'global';
console.log(this.x); // "global"
console.log(this.y); // undefined
如果你将代码移动到一个函数中,它也不会工作,顺便说一句,因为 var
(或 let
,现在无关紧要)语句会只需在函数中创建一个局部变量,而不是在全局对象上创建一个 属性,因此无法通过 any 对象的 myName
属性.
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'?太乱了,求大神指教
Why the result of the first function execution is undefined ?
因为您没有将 this
绑定到函数调用中的任何内容(您既没有 objectThatWillBecomeThis.printName()
也没有 printName.call(objectThatWillBecomeThis)
)。在严格模式下,这会崩溃,因为 this
将是 undefined
然后你会尝试读取 undefined.myName
。但是由于您没有启用严格模式,因此遗留行为处于活动状态,其中 this
- 如果未明确设置 - 将设置为全局对象。但是,全局对象没有任何 属性 myName
(在浏览器中:没有 window.myName
)所以结果是 undefined
.
why output 'outer' after changing let to var ?
因为如果您在全局范围内 运行 此代码,任何其他范围之外的 var
将在全局对象 (window.myName
) 上创建一个 属性。 let
doesn't do that:
At the top level of programs and functions,
let
, unlikevar
, does not create a property on the global object. For example:var x = 'global'; let y = 'global'; console.log(this.x); // "global" console.log(this.y); // undefined
如果你将代码移动到一个函数中,它也不会工作,顺便说一句,因为 var
(或 let
,现在无关紧要)语句会只需在函数中创建一个局部变量,而不是在全局对象上创建一个 属性,因此无法通过 any 对象的 myName
属性.