3
var foo = 'bar';
console.log(window.foo); // bar

変数はプロパティとしてに割り当てられるようですがthis、無名関数内でthisは親スコープを参照しますが、変数は親スコープに割り当てられません。

function() {
    var foo = 'bar';
}();

window.foo; // undefined

非グローバルスコープで変数はどのオブジェクトに割り当てられますか?

4

4 に答える 4

5

http://perfectionkills.com/understanding-delete/#execution_contextを引用するには:

すべての実行コンテキストには、いわゆるVariable Object関連付けがあります。実行コンテキストと同様に、Variableオブジェクトは抽象エンティティであり、変数のインスタンス化を記述するメカニズムです。ここで、興味深い部分は、ソーステキストで宣言された変数と関数が実際にこのVariableオブジェクトのプロパティとして追加されることです。

コントロールがグローバルコードの実行コンテキストに入ると、aGlobal object がとして使用されますVariable object。これがまさに、グローバルに宣言された変数または関数がGlobal object

ただし、これらVariable Objectにはアクセスできません。唯一の非内部オブジェクトは、グローバルオブジェクト、windowまたはthis(グローバルコンテキストでは)です。

仕様の関連セクションは、#10:実行可能コードと実行コンテキストです。

于 2012-06-05T16:44:51.587 に答える
2

JavaScriptでは、すべての変数が特定のスコープオブジェクトに割り当てられます。ただし、グローバル変数のスコープオブジェクトのみが、オブジェクトを介してブラウザのJavaScriptでアクセスできwindowます。関数スコープの変数は、JavaScriptランタイムによって内部的に使用されるスコープオブジェクトに割り当てられますが、ユーザーはこれにアクセスできません。

別の環境では、グローバル変数は別のオブジェクトのプロパティとしてアクセスできる場合(node.jsなどGLOBALまたはアクセスできない場合があります(Windows Script Host内で実行されているアプリケーションスクリプトなど)。

于 2012-06-05T16:42:31.227 に答える
0

それらは、宣言されている関数でのみ使用できます。

関数スコープは、他の言語のブロックスコープとは異なり、JavaScriptの他の唯一のスコープ{}です。)

Re:あなたの編集騙されないでくださいthis--JSのセマンティクスは少し厄介なIMOです-thisさまざまな状況下であなたが期待するものではないかもしれません。

于 2012-06-05T16:40:13.987 に答える
0

自己呼び出し無名関数の内部例:

function() {
    ....
}()

すべての変数はその中に残り、グローバルオブジェクトまたはにアタッチされませんwindowその手法を使用して、モジュール/シングルトンパターンなどのパターンが作成されます。

JSでは、変数に関数レベルのスコープがあることに注意してください。

于 2012-06-05T16:40:32.780 に答える