2013-05-18 12 views
10

Czytam kod źródłowy KnockoutJS."new" Przed anonimowym wywołaniem funkcji Zwrócenie obiektu

wpadłem na następujący wiersz, który nie jestem pewien, czy rozumiem ...

ko.utils = new (function() { 

Generalnie struktura wydaje się wzdłuż linii:

ko.utils = new (function() { 

    // some variables declared with var 

    return { 
     export:value, 
     export:value 
    }; 

})(); 

I don” t zrozumieć ten konstrukt, dlaczego jest potrzebny new? Co to robi? Do czego jest przydatny?

(myślałem, że jeśli funkcja jest wywoływana z new przed jego nazwą jest ona wywoływana jako konstruktor, a jeśli to zwraca obiekt jest identyczny z invokation bez new).

UPDATE: Poprosiłem zespół KnockoutJS na githubie i to jest to, co otrzymałem:

Domyślam się, że Steve po prostu nie wiedział, że nie był potrzebny. Patrząc wstecz na jego pierwotne zatwierdzenie, widzę wiele niepotrzebnych wiadomości, które zostały usunięte.

+1

O ile mogę powiedzieć, Polecenie 'new' nie wpływa w tym przypadku –

+0

related: [Czy to dobrze myśleć o wyrażeniu funkcji JavaScript, który używa„nowych”słowa kluczowego jako„static”] (http://stackoverflow.com/questions/10406552/is-right-to-think-of-a-javascript-function-expression- that-uses- the-new-key) – Bergi

+0

Po prostu trafiłam na oba one ... – Bergi

Odpowiedz

10

To może być jakiś wzór który zapobiega this dotrzeć do globalnego kontekstu (nie w tym przypadku, ponieważ każda zmienna jest zadeklarowana var, ale może autor chciał użyć go jako ogólny wzór do tworzenia obiektów).

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 To bardzo sprytne :) (od ciebie, aby zrozumieć to rozumowanie). Coś w rodzaju "użyj ścisłego"; 'unika. To całkowicie satysfakcjonujące, dziękuję. –

Powiązane problemy