JavaScriptスコープルールを理解しようとしています。私が教科書やドキュメンテーションで読んだことは混乱しています。JavaScriptスコープと実行コンテキスト
JavaScriptは静的(またはレキシカル)スコープ言語です。変数名を変数(定義)にバインドしようとすると、コードの字句構造が使用されます。
実行コンテキストは、コールスタック上のスタックフレームと似ているようです。各実行コンテキストには、関連する関数のすべてのローカル変数が定義される変数オブジェクトがあります。これらの変数オブジェクトは、スタックの最上部の変数オブジェクトからスタックの最下部の変数オブジェクト(ウィンドウオブジェクト)への 'スコープチェーン'を提供するために互いにリンクされています。このスコープチェーンは、変数名を変数にバインドする際に上から下に検索されます。これはC/C++/Javaのような静的スコープ言語と非常によく似ています。
C/C++/Javaに関して重要な違いが1つあります。以下の例に示すように、スタックフレームが呼び出しスタック上に存在しない関数で定義された変数にアクセスすることは可能です。
var color = "red";
var printColor;
function changeColor() {
var color = "green";
printColor = function(msg) {
alert(msg + color);
}
printColor("in changeColor context, color = "); // "green"
}
changeColor();
// stack frame for "changeColor" no longer on stack
// but we can access the value of the variable color defined in that function
printColor("in global context, color = "); // "green"
私はこの権利を得ていますか?私が気づくべき他の問題はありますか?予め
おかげ
今日、非常に徹底的にポストヒットしたHN:[JavaScriptの実行コンテキストとスタックは何ですか](http://davidshariff.com/blog/what-is-the-execution-context-in- javascript /) –
これは* closure *と呼ばれます。 'printColor'に割り当てた関数は、関数が終了した後でも' changeColor'で定義されたすべての変数にアクセスできます。私はこれがCでどのようになっているのか分かりません。 –
@FelixKling。しかし、changeColorはグローバルスコープでも定義されているため、スコープはガベージコレクションされません。 – webduvet