1

firefox 21.0 で以下が TypeError をスローするのはなぜですか?

Object.defineProperty(window,'windowProperty',{
    get: function(){
        return 'windowProperty'
    },

    set: function(val){
        console.log('windowProperty is being set');
    },

    configurable: true,
});

var windowProperty;

ただし、var を使用せずに windowProperty を宣言すると機能します。

windowProperty;

または

window.windowProperty;

この動作は、spidermonkey にも存在します。

var a=1;

Object.defineProperty(this,'a',{
    get: function(){
        return 'a';
    },
});
4

1 に答える 1

2

書き込みのみ

windowProperty;

変数を宣言しません。undefined最も近いコンテキストで、または見つからない場合は、変数のコンテンツを返そうとするだけです。目標のない課題のようなものです。たとえば、エラーをスローせずにランダムなテキストを書き込むこともできます。

'Hello, world !';
123456;
undefined;

代わりに var を使用すると、コード内で既に定義されているプロパティを再定義しようとするため、エラーが発生します。

EDIT
simonzack が正確に述べているように、ブラウザは変数を再定義するときに常にエラーを送信するとは限りません。例えば:

var test; var test;

はこのエラーをスローしません (それが悪い考えであり、一部の JS バリデーターが警告する場合でも)。ただし、getter と setter を定義することにより、ブラウザーはこのプロパティを「ロック」します (たとえば、同じプロパティに対する 2 つの異なる setter の衝突を防ぐため)。悪い、それは誤解です。

変数を再定義する理由はありますか?

EDIT 2宣言がの前に
行われたことを考慮して、説明に精度を追加できます。実際、最初に宣言を使用すると、ブラウザーは状態を false に設定し、記述子の変更を防ぎます (リンクを参照)。そのため、関数で変更しようとすると、エラーが発生します。よくわかる例は、クロージャ関数でコードをラップすることです。このように、によって定義された windowPropertyは同じではなく、すべて問題ありません。vardefinePropertyvarconfigurabledefinePropertyvar

(function () {
    var windowProperty;
    Object.defineProperty(...);
    //It works because the previously defined variable is in the scope of the function and thus is not the same as window.windowProperty.
})();
于 2013-06-22T12:30:33.673 に答える