2011-10-04 6 views
7

を発行します。生命維持のコンテキストには、次の構文で

(function(){ 

    var x = function(){ 
     alert('hi!'); 
    } 

    var y = function(){ 
     alert("hi again!"); 
    } 

    this.show = function(){ 
     alert("This is show function!"); 
    } 

})(); 

はなぜthiswindowオブジェクトを参照しますか? IIFE内のすべてをグローバルスコープから分離する必要がありますか? xyは、windowグローバルオブジェクトのプロパティとしても機能しますか?

また、私が使用している場合でも先頭にvar h = ...を置く:

var h = (function(){ 

    var x = function(){ 
     alert('hi!'); 
    } 

    var y = function(){ 
     alert("hi again!"); 
    } 

    this.show = function(){ 
     alert("This is show function!"); 
    } 

})(); 

thisはまだウィンドウオブジェクトを参照する - 私はグローバルスコープからshow()を呼び出すことができます!どうして?

答えて

9

ブラウザでグローバルコンテキスト(window)は値thisになり、使用する他の値がない場合に取得されます。

ローカル変数はローカルです(つまり、プロパティはwindowではありません)。それらは関数内でvarと宣言されています。

var h = (function(){...を追加する理由は、関数の呼び出し方法が異なるためです。関数参照はオブジェクトのプロパティ値(something.func()など)ではなく、.call()または.apply()で呼び出さないため、グローバル(window)オブジェクトを参照します。これは、言語が行動するように定義されている方法です。

8

@Pointyは正しいですが、彼は問題全体を提示しません。this related answerに興味があるかもしれません。ここでの問題は、newキーワードを使用していない場合、オブジェクトをインスタンス化していないため、thisのインスタンスが参照されないことです。インスタンスがない場合、thiswindowオブジェクトを指します。一般的に

、あなたが匿名関数のスコープで定義された任意の関数や変数に直接アクセスする必要があるため、生命維持の中thisを必要としない - show()を直接x()y()を呼び出すことができますので、this参照のための必要はありません。 newでIIFEをインスタンス化するための有効なユースケースがあるかもしれませんが、私はそれを見つけたことはありません。

+0

有効なケースは、IIFE内の「this」をコールバックの作成に使用する別のオブジェクトに渡す必要がある場合です。 – AndroidDev

関連する問題