9

という JavaScript グローバル変数を定義するとname、window.name プロパティが非表示になりますか?

Facebook JavaScript認証APIのコンテキストでこれを尋ねます.その名前のグローバルを持つとそれが壊れることに気づいたので、またwindow.nameコードでそれが使用されているのを見たからです.

4

2 に答える 2

7

nameがグローバル変数の場合、とnamewindow.name同等です。

グローバル変数と関数は、グローバル オブジェクトのメンバーです。ブラウザーでは、グローバル オブジェクトには、値がグローバル オブジェクトであるウィンドウ メンバーが含まれます。

于 2012-06-16T15:51:06.473 に答える
5

を使用してグローバル スコープで変数を宣言すると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

letorで宣言すると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
于 2012-06-16T15:49:06.800 に答える