如果我定義了一個名爲name
的JavaScript全局變量,是否隱藏了window.name屬性?var name和window.name
我在Facebook JavaScript身份驗證API的環境中詢問了這一點,因爲我注意到擁有該名稱的全局將會破壞它,並且因爲我看到在他們的代碼中使用了window.name
。
如果我定義了一個名爲name
的JavaScript全局變量,是否隱藏了window.name屬性?var name和window.name
我在Facebook JavaScript身份驗證API的環境中詢問了這一點,因爲我注意到擁有該名稱的全局將會破壞它,並且因爲我看到在他們的代碼中使用了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
或聲明它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
如果name
是一個全局變量,然後name
和window.name
是等價的。
全局變量和函數是全局對象的成員。在瀏覽器中,全局對象包含一個窗口成員,其值是全局對象。
@Xufox:謝謝!我似乎完全錯過了這個問題的「隱藏」部分。更新。 – Ryan