var 名称和 window.name

IT技术 javascript
2021-01-26 00:14:04

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

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

2个回答

如果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

如果你用letor声明它const,它不会:

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
@Xufox:谢谢!我似乎完全错过了这个问题的“隐藏”部分。更新。
2021-03-13 00:14:04