var name和window.name

时间:2012-06-16 15:47:04

标签: javascript

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

我在Facebook JavaScript身份验证API的上下文中提到这一点,因为我发现拥有该名称的全局会破坏它,并且因为我发现它们的代码中使用了window.name

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

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