2013-05-18 31 views
10

KnockoutJSのソースコードを読んでいます。 「私はドン"new"匿名関数呼び出しの前に返すオブジェクト

ko.utils = new (function() { 

    // some variables declared with var 

    return { 
     export:value, 
     export:value 
    }; 

})(); 

私は私が理解していない次の行に走った

...

ko.utils = new (function() { 

は一般的に、構造物の線に沿ってのようですこのコンストラクトを理解すると、なぜnewが必要ですか?それは何をするためのものか?それは何のために便利ですか?

(私は関数は、その名前の前newで呼び出された場合、それはコンストラクタとして呼び出され、それがオブジェクトを返す場合、それはnewなしinvokationと同じだと思った。)

UPDATE:私は尋ねましたgitubのKnockoutJSチームとこれが私が戻ったものです:

私の推測では、スティーブはそれが必要でないことをちょうど知らなかったということです。彼の元のコミットを振り返ってみると、削除された不必要なニュースがたくさんあることがわかります。

+1

は、私の知る限り、 'new'、この場合 –

+0

関連では効果がありません:([それは正しい「静的」と「新しい」キーワードを使用していますJavaScript関数の式を考えることです] http://stackoverflow.com/questions/10406552/is-it-right-to-think-of-a-javascript-function-expression-that-uses-the-new-key) – Bergi

+0

ちょうど両方のそれら... – Bergi

答えて

10

(すべての変数がvar宣言されているので、ないこの場合は、しかし、著者は、オブジェクトを作成するために、一般的なパターンとして、それを使用していたかもしれません)これは、グローバルコンテキストに到達するためにthisを防止し、いくつかのパターンがあります。

var x = new (function() { 
    this.foo = "bar"; 
    return { 
     // whatever 
    }; 
})(); 

console.log(foo); // Uncaught ReferenceError: foo is not defined 

var x = (function() { // without new 
    this.foo = "bar"; 
    return { 
     // whatever 
    }; 
})(); 

console.log(foo); // "bar" 
+0

+1それは非常に賢いです:)(あなたの推論を把握するために)。 ''厳密に使う '; ''のようなものは避けます。それは完全に満足です、ありがとう。 –

関連する問題