Profundice en la relación entre las propiedades de los objetos globales de Javascript y las declaraciones de variables

Acerca de la declaración de variable y objeto global

Hoy revisé el video de aprendizaje de js. Cuando hablé sobre el constructor, agregué el this point del constructor y la función ordinaria, que hablaba del objeto window.

Todos sabemos que el this del constructor apunta al objeto instanciado, mientras que el this de la función ordinaria en realidad apunta al objeto de la ventana. Entonces habrá esta situación:

function f1(){
    
    
    console.log(this);   
}
f1();     //这里调用后打印出来的会是window对象

Las funciones como alert son en realidad miembros del objeto global de ventana, y la ventana se puede omitir:

alert('123');
window.alert('123');   //这两个是等同的

Las variables que declaramos se convertirán en propiedades del objeto de ventana:

let num = 100;
console.log(window);   
//-> 会发现window对象里会多出一个属性num,值为100

Piense en la oración: "Todo en JS es un objeto". De repente se me ocurrió que este tipo de declaración de variable en realidad está agregando atributos al objeto de la ventana. ¿Son los dos equivalentes? En otras palabras:

** alcance global window.numy var numno es lo mismo? **

Con esta idea, hice la siguiente prueba:

//测试直接给window添加属性,能不能向变量一样仅凭属性名就打印?
window.num = 10;
alert(num);    //-> 10
//果然,测试的结果是,num可以正常打印

//那再使用变量重新声明呢?
window.age = 18;
var age = 20;    
alert(age);   //-> 20
//果然,打印出来的是重新声明的值,这是不是意味着window.age这个属性被变量声明给“覆盖”了呢?
alert(window.age);  //-> 20
//说明确实被覆盖了

//反过来也一样
var name = 'Jack';
window.name = 'Nick';
alert(window.name);   //-> Nick
//一次性打印两个时
console.log(window.name,name);  //-> Jack Jack

//看看两者是否相等:
console.log(window.name===name);   //-> true

Luego leí el libro "Programación avanzada de JavaScript", hay este pasaje en el objeto de la ventana:

Debido a que el objeto de ventana se reutiliza como el objeto global de ECMAScript, todas las variables y funciones globales declaradas a través de var se convertirán en las propiedades y métodos del objeto de ventana. como:

var age = 29;
var sayAge = () => alert(this.age);

alert(window.age);  // 29
sayAge();   // 29
window.sayAge();  //29

También está este párrafo:

Pero usar let o const en lugar de var no agregará la variable al objeto global.

En otras palabras, ocurrirá esta situación:

window.age = 18;
let age = 20;    
console.log(age , window.age);   //-> 20 18   
//两个都可以正常打印,值互不干扰

const num = 10;
console.log(window.num);   //-> undefined

Además, el acceso a variables no declaradas arrojará un error, pero puede consultar en el objeto de la ventana posibles variables no declaradas:

var newVal = oldval;  //会抛出错误,因为oldVal没有声明

var newValue = window.oldvalue;
//这里不会抛出错误,因为这里是属性查询
//newValue会被设置成undefined

Supongo que te gusta

Origin blog.csdn.net/Lu_xiuyuan/article/details/112987642
Recomendado
Clasificación