2012-06-16 74 views
4

如果我定義了一個名爲name的JavaScript全局變量,是否隱藏了window.name屬性?var name和window.name

我在Facebook JavaScript身份驗證API的環境中詢問了這一點,因爲我注意到擁有該名稱的全局將會破壞它,並且因爲我看到在他們的代碼中使用了window.name

回答

3

如果你聲明與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 
+0

@Xufox:謝謝!我似乎完全錯過了這個問題的「隱藏」部分。更新。 – Ryan

4

如果name是一個全局變量,然後namewindow.name是等價的。

全局變量和函數是全局對象的成員。在瀏覽器中,全局對象包含一個窗口成員,其值是全局對象。

相關問題