如果我定义一个名为name
的JavaScript全局变量,那会隐藏window.name属性吗?
我在Facebook JavaScript身份验证API的上下文中提到这一点,因为我发现拥有该名称的全局会破坏它,并且因为我发现它们的代码中使用了window.name
。
答案 0 :(得分:6)
如果name
是全局变量,则name
和window.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
如果您使用let
或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