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.