变量名称和 window.name

var name and window.name

本文关键字:name window 变量名      更新时间:2023-09-26

如果我定义一个名为 name 的 JavaScript 全局变量,这会隐藏 window.name 属性吗?

我在Facebook JavaScript身份验证API的上下文中问这个问题,因为我注意到拥有该名称的全局会破坏它,而且因为我看到window.name在他们的代码中使用

如果 name 是全局变量,则 namewindow.name 是等效的。

全局

变量和函数是全局对象的成员。在浏览器中,全局对象包含一个窗口成员,其值是全局对象。

如果使用 var 在全局范围内声明一个变量,它将在全局对象上创建一个属性或写入现有对象(如 name):

var name = 5;
console.log(window.name === '5');  // true
console.log(name === '5');  // true
console.log(Object.getOwnPropertyDescriptor(window, 'name'));
    // object with get and set
var foo = 6;
console.log(Object.getOwnPropertyDescriptor(window, 'foo'));
    // object with value
Object.defineProperty(window, 'bar', {
    writable: false,
});
var bar = 7;  // throws in strict mode
var baz;
console.log('baz' in window);  // true

如果使用 letconst 声明它,则不会:

const name = 5;
console.log(window.name);  // likely an empty string
console.log(name === 5);  // true
console.log(Object.getOwnPropertyDescriptor(window, 'name'));
    // same as var
const foo = 6;
console.log(window.foo);  // undefined
console.log(Object.getOwnPropertyDescriptor(window, 'foo'));
    // undefined
Object.defineProperty(window, 'bar', {
    writable: false,
});
const bar = 7;  // succeeds
let baz;
console.log('baz' in window);  // false