如果我定义一个名为 的 JavaScript 全局变量name
,是否会隐藏 window.name 属性?
我在 Facebook JavaScript 身份验证 API 的上下文中问这个问题,因为我注意到拥有该名称的全局名称会破坏它,而且我看到window.name
他们的代码中使用了它。
如果我定义一个名为 的 JavaScript 全局变量name
,是否会隐藏 window.name 属性?
我在 Facebook JavaScript 身份验证 API 的上下文中问这个问题,因为我注意到拥有该名称的全局名称会破坏它,而且我看到window.name
他们的代码中使用了它。
如果name
是一个全局变量,那么name
和window.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
如果你用let
or声明它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