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

Why can't I access a declared variable in the global scope [duplicate]

提问人:MatrixZHi 提问时间:4/11/2022 最后编辑:MatrixZHi 更新时间:4/11/2022 访问量:109

问:

        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”?这太令人困惑了,请帮帮我。

JavaScript 作用域

评论


答:

0赞 CherryDT 4/11/2022 #1

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

因为你没有绑定到函数调用中的任何内容(你既没有也没有)。在严格模式下,这将崩溃,因为那时你会尝试阅读 .但是,由于您没有启用严格模式,因此旧行为处于活动状态,在未显式设置时,将设置为全局对象。但是,全局对象没有任何属性(在浏览器中:没有),因此结果是 .thisobjectThatWillBecomeThis.printName()printName.call(objectThatWillBecomeThis)thisundefinedundefined.myNamethismyNamewindow.myNameundefined

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

因为如果在全局范围内运行此代码,则在任何其他范围之外都会在全局对象 () 上创建一个属性。 不这样做varwindow.myNamelet

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

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

顺便说一句,如果你将代码移动到函数内部,它也不会起作用,因为(或,现在无关紧要)语句只会在函数中创建一个局部变量,而不是全局对象上的属性,因此无法通过任何对象的属性访问它。varletmyName