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()¿Por qué el resultado de la ejecución de la primera función no está definido? Pensé que el resultado sería 'externo', y ¿por qué generar 'externo' después de cambiar let a var? Esto es muy confuso, por favor ayúdame.
¿Por qué el resultado de la ejecución de la primera función no está definido?
Porque no vincula this a nada en la llamada a la función (no tiene objectThatWillBecomeThis.printName() ni printName.call(objectThatWillBecomeThis) ). En modo estricto, this fallaría porque entonces no estaría undefined y usted intentaría leer undefined.myName . Pero dado que no habilitó el modo estricto, el comportamiento heredado está activo en el que this , cuando no se establece explícitamente, se establecerá en el objeto global. Sin embargo, el objeto global no tiene ninguna propiedad myName (en el navegador: no hay window.myName ), por lo que el resultado no está undefined .
¿Por qué mostrar 'exterior' después de cambiar let a var?
Porque si ejecuta este código en el ámbito global, var fuera de cualquier otro ámbito creará una propiedad en el objeto global ( window.myName ). let hagas eso :
En el nivel superior de programas y funciones,
let, a diferencia devar, no crea una propiedad en el objeto global. Por ejemplo:var x = 'global'; let y = 'global'; console.log(this.x); // "global" console.log(this.y); // undefined
Si moviera el código dentro de una función, tampoco funcionaría, por cierto, porque la instrucción var (o let , no importa ahora) simplemente crearía una variable local en la función y no una propiedad en el objeto global, por lo que no habría forma de acceder a él a través de la propiedad myName de ningún objeto.