提问人:MatrixZHi 提问时间:4/11/2022 最后编辑:MatrixZHi 更新时间:4/11/2022 访问量:109
为什么我无法访问全局范围内声明的变量 [duplicate]
Why can't I access a declared variable in the global scope [duplicate]
问:
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”?这太令人困惑了,请帮帮我。
答:
0赞
CherryDT
4/11/2022
#1
为什么第一个函数执行的结果是未定义的?
因为你没有绑定到函数调用中的任何内容(你既没有也没有)。在严格模式下,这将崩溃,因为那时你会尝试阅读 .但是,由于您没有启用严格模式,因此旧行为处于活动状态,在未显式设置时,将设置为全局对象。但是,全局对象没有任何属性(在浏览器中:没有),因此结果是 .this
objectThatWillBecomeThis.printName()
printName.call(objectThatWillBecomeThis)
this
undefined
undefined.myName
this
myName
window.myName
undefined
为什么在将 let 更改为 var 后输出“outer”?
因为如果在全局范围内运行此代码,则在任何其他范围之外都会在全局对象 () 上创建一个属性。 不这样做:var
window.myName
let
在程序和函数的顶层,与 不同,它不会在全局对象上创建属性。例如:
let
var
var x = 'global'; let y = 'global'; console.log(this.x); // "global" console.log(this.y); // undefined
顺便说一句,如果你将代码移动到函数内部,它也不会起作用,因为(或,现在无关紧要)语句只会在函数中创建一个局部变量,而不是全局对象上的属性,因此无法通过任何对象的属性访问它。var
let
myName
评论