2013-06-12 5 views

答えて

26

我々は変数のスコープを管理するために、自己実行中の関数を使用します

変数のスコープは、プログラムが定義されている領域です。 グローバル変数にはグローバルスコープがあります。 JavaScriptコードのどこにでも定義されています。 (でも機能はです)。 一方、関数内で宣言された変数は、関数本体内でのみ定義されます。それらはローカル変数であり、ローカルスコープを持ちます。関数パラメータもローカル変数としてカウントされ、関数本体内でのみ定義されます。

var scope = "global"; 
function checkscope() { 
    alert(scope); 
} 

checkscope(); // global 

見ての通り、あなたの関数の中scope変数にアクセスすることができ、 しかし、関数の本体の中に、ローカル変数は、同じ名前のグローバル変数よりも優先されます。グローバル変数と同じ名前のローカル変数または関数パラメータを宣言すると、グローバル変数を効果的に隠すことができます。

ご覧のとおり、関数内の変数はグローバル変数を上書きしません。 この機能により、自己実行関数 内にコードを入れて、他の変数を上書きしないようにします。コードが大きくて大きくなるととなります。

// thousand line of codes 
// written a year ago 

// now you want to add some peice of code 
// and you don't know what you have done in the past 
// just put the new code in the self executing function 
// and don't worry about your variable names 

(function() { 
    var i = 'I'; 
    var can = 'CAN'; 
    var define = 'DEFINE'; 
    var variables = 'VARIABLES'; 
    var without = 'WITHOUT'; 
    var worries = 'WORRIES'; 

    var statement = [i, can, define, variables, without, worries]; 

    alert(statement.join(' ')); 
    // I CAN DEFINE VARIABLES WITHOUT WORRIES 
}()); 
12

IIFE(すぐに呼び出される関数式)は、グローバル変数を作成回避hello

他の用途もありますが、投稿したコードの例がその理由です。

+0

これを拡張する。 IIFEは、上記の機能の「拡張」となるカスタム名前空間を作成するのにも適しています。 –

5

別にクリーングローバル名前空間を保つことから、彼らはまた、まだ後で使用するために、いくつかのプロパティを公開しながら、アクセス可能な機能のためのプライベートメソッドを確立するために有用です -

var counter = (function(){ 
    var i = 0; 

    return { 
    get: function(){ 
     return i; 
    }, 
    set: function(val){ 
     i = val; 
    }, 
    increment: function() { 
     return ++i; 
    } 
    }; 
}()); 

// 'counter' is an object with properties, which in this case happen to be 
// methods. 

counter.get(); // 0 
counter.set(3); 
counter.increment(); // 4 
counter.increment(); // 5 
2

いくつかの理由が考えられます。

新しいスコープを作成するため、最初のスコープはスコープを保護しています。これにより、競合の可能性を減らす -

もう一つは、例えばグローバル名前空間クリーンに保つ

for (var i = 0; i < n; i++) { 
    element.onclick = (function(i){ 
     return function(){ 
     // do something with i 
    } 
    })(i); 
} 
+0

これを使用してWebアプリケーション全体の起動をカプセル化することは可能でしょうか?そうであれば、それはグローバル名前空間を宣言する優れた手段になります。しかし、この時点で私が持っている質問は、これを使ってどのようにして望ましいエンティティを永続的にするのでしょうか?これを達成するには閉鎖に頼らなければなりませんか? –

関連する問題