2016-08-26 6 views
0

私はIIFE内のコンストラクタに引数として関数を渡しています。私は、IIFEの外部関数が実行されることを認識していますが、関数の引数も実行されているようです。私は本当に理由を理解していないし、この問題を回避する方法を考えている。ここに2つの例があります:JavaScriptのIIFEは再帰的ですか?

var Foo = function(bar) { 
    this.bar = bar; 
}; 
new Foo(function() { console.log("test"); }); 

上記の例では、私は期待していたとおりに動作します。無名関数は引数としてFooコンストラクタに渡されますが、実行されません。ここで

は生命維持内で作成された匿名関数は、それが明示的に呼び出されていなくても、実行され表示された別の例では、です:この2番目の例では

(function() { 
    var Foo = function(bar) { 
     this.bar = bar; 
    }; 
    Foo.STATIC_FIELD = new Foo(new function() { console.log("test"); }); 
    return Foo; 
})(); 

、「テストは」に書かれていますコンソール。私はIIFEを使って、グローバルネームスペースをFooで汚染されないように保護しています。しかし、私はFooコンストラクタに渡された関数を直ちに実行させたくありません。これは、後でFoo.STATIC_FIELD.bar()で呼び出すことができるように保持している関数です。これを達成する最良の方法は何ですか?

+4

2番目の例では、 'new'を使用して無名関数を呼び出しています。 'new'を削除すれば、あなたは金色になります。 –

+1

私はそれが1だと思うので、私はこれをタイプミスにしました。それ以外の場合はよく書かれた質問です。 – DavidS

+0

実際、私は最初の例でもnewを使うつもりだった。しかし、あなたは正しい。私の本能は、私が何かを創造するために新しいものを使用しなければならないということです。しかし、この場合は、newを使って関数を作成せず、newを使って関数を実行します。 「newFunction()」と同じことを「newFunction()」のように行うのは、奇妙なことです。 –

答えて

-2

私の質問は、マイクCとDavidSのコメントで十分に答えられました。後で呼び出すために関数を格納したい場合は、関数を実行するため "new"を使用しないでください。後で、関数に保持されているオブジェクトのコンテキストを使用して、その関数で「呼び出し」を呼び出すようにしてください。例:

foo.myFunction.call(foo); 
+0

あなたが知っているのは、 'foo.myFunction()'だけを実行するだけです。 –

+0

インタープリタは 'new'を使うと'() 'を追加し、関数の後に'() 'を追加しません – passion