2012-10-17 9 views
18

JavaScriptのクロージャの定義は言う:自由変数とは何ですか?

A「閉鎖」(表現を「クローズ」という) これらの変数をバインドし、環境と一緒に自由 変数を持つことができる表現(通常の関数)です。

自由変数の概念を私に説明できますか?このコンセプトはJavaScript固有であるか、他の言語にも適用されますか?

+3

空き変数は、単に関数内で宣言されていない変数ですが、その内部で使用されます。 –

答えて

22

フリー変数は、ローカルで宣言されておらず、パラメータとして渡されていない変数です。コンピュータプログラミングにおいて

Source :

、用語自由変数は、変数 関数で使用されるローカル変数もその 関数のパラメータではないことをいいます。 1非ローカル変数という用語は、多くの場合、この コンテキストの同義語です。

javascriptクロージャでは、クロージャが宣言されている囲みスコープ内または親スコープ内で関数が(読み書き)する変数です。この現実世界の例で

ルック:この例では

Gol.prototype._ensureInit = function() { 
    ... 
    var _this = this; 
    var setDim = function() { 
     _this.w = _this.canvas.clientWidth; 
     _this.h = _this.canvas.clientHeight; 
     _this.canvas.width = _this.w; 
     _this.canvas.height = _this.h; 
     _this.dimChanged = true; 
     _this.draw(); 
    }; 
    setDim(); 
    window.addEventListener('resize', setDim); 
    ... 
}; 

囲みスコープで宣言された変数_thisに向けたsetDim関数からクロージャポイント(_ensureInit機能)。この変数はsetDimで宣言されていません。 "フリー変数"です。

_thisは、関数setDimの変数にならないことに注意してください。同じスコープで宣言された別の関数は同じ変数を共有します。

+0

"この文脈では、これらは単に関数がクロージャが宣言されている囲みスコープ内で(読み書き)する変数です。あなたがそこで何を意味していたのかわからないあなたは例を挙げて説明することができますか? – Geek

+0

@Geek実世界の例を追加しました –

0

例として:変数は、クロージャ変数が存在する定義

var myModule = (function(){ 
    var moduleVar; // closure variable 

    return function(){ 
    // actual function 
    } 
})(); 

。クロージャ全体で使用できますが、グローバル名前空間の一部ではありません。

0

「自由翻訳」は、"out of scope" - variablesとすることができます。

ECMAscriptはレキシカルスコープを使用するため、フリー変数は親スコープ内で定義された変数で、スコープチェーン検索によってルックアップされます。上記の例で

(function _outerScope() { 
    var foo = 42; 

    (function _innerScope() { 
     var bar = 100; 

     console.log(foo + bar); // 142 
    }()); 
}()); 

foo_innerScopeの文脈内自由変数あります。 ECMAscriptの基本概念をすばやく把握することが非常に明白になります。

コンテキストは、それぞれ、(ES3で)起動対象に連結されている字句的環境レコードようなものを含んでいる、(ES5に)への参照としても、function declarationsvariables declared with varformal paramtersすべて親アクティベーションオブジェクト/レキシカル環境。変数にアクセスする必要がある場合、ECMAscriptエンジンは、現在コンテキストからAOs/LEsを探します。そこに見つけることができない場合は、それは親に見えるAOの/ LEのです。私たちはすべてを検索するので任意のコンテキスト店以来

配列のような構造でこのデータ(Javascriptを自体、私たちはここで実装レベルの話をしているではないことを忘れないでください)、私たちは、およそLexical Scopeを話しています親コンテキストを順番に使用します。

関連する問題