9

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

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

4

2 回答 2

7

如果name是一个全局变量,那么namewindow.name是等价的。

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

于 2012-06-16T15:51:06.473 回答
5

如果您在全局范围内使用 声明一个变量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
于 2012-06-16T15:49:06.800 回答