为什么我不能在全局范围内访问声明的变量

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 属性.