2015-03-18 5 views
7

Natknąłem jakiś kod, który ma tego rodzaju wzór w wielu miejscach:Jaki jest cel this.someFunction.call (this, param);

this.someFunction.call(this, param); 

ale wydaje mi się po prostu bardziej rozwlekły sposób wpisywać

this.someFunction(param) 

Wzór czasami pojawia się wewnątrz funkcja dostarczana jako wywołanie zwrotne. Zdarza się używać Backbone, jeśli jest to istotne. Coś takiego:

Backbone.View.extend({ 
    // other stuff ... 

    someFunction: function(param) { 
     // ... 
    }, 
    anotherFunction: function() { 
     this.collection.on("some_event", function() { 
      this.someFunction.call(this, param); 
     }); 
    } 
}); 

Czy wzór faktycznie mają wpływ, który nie jest odpowiednikiem this.someFunction(param) albo ktoś po prostu nerwowy o zamknięcie nie przechwytywanie poprawne this?

Dzięki za wszelkie spostrzeżenia!

+3

* "czy ktoś był po prostu zdenerwowany tym zamknięciem, nie przechwytując poprawnego" tego "" * "to" jest specjalną wartością w funkcjach i nie ma na nią wpływu zasięg. (wyjątek: funkcje strzałki ES6). Nie widzę powodu, aby preferować '.call' ponad normalne wywołanie funkcji. –

+0

Obie są równoważne prawdopodobnie pewnej konwencji kodowania. Skrypty są również często maskowane. – kidwon

+0

Zauważ, że użycie funkcji call() dodaje trochę narzutów i spowalnia wykonywanie, co jest szczególnie widoczne w pętlach. kod mógłby być zapisany jako 'this.collection.on (" some_event ", this.someFunction.bind (this, param));' który blokuje _to przed czasem, który może być szybszy niż call(). chociaż, w zależności od tego, w jaki sposób szkielet korzysta z _this_, możesz potrzebować duplikować związaną wartość inFunctionFunction(), aby mieć odpowiednią wartość _ w tym czasie. – dandavis

Odpowiedz

2

Czy wzór faktycznie mają wpływ, który nie jest odpowiednikiem this.someFunction(param)?

Nie, w rzeczywistości są one takie same. Zakładając, że this.someFunction jest funkcją, która dziedziczy .call z Function.prototype (ale to jest wybieranie nitów).

Wygląda na to, że ktoś był nieostrożny, a kod jest pozostałością czegoś, z czego dwa razy nie korzystano z this. A może autor wiedział o this-context-in-callbacks issue, ale nie poradził sobie z tym poprawnie.

1

Nie widzę powodu, aby używać takiego sposobu wywoływania funkcji w podanym przez ciebie kodzie. Tu lepiej jest użyć bezpośredniego wywołania funkcji tak (jeśli nie wymagają modyfikacji argumentów)

this.collection.on("some_event", this.someFunction, this); 

lub

this.collection.on("some_event", function() { 
    this.someFunction(//some modified args) 
}, this); 

I niech mi podać przykład prawidłowego wykorzystania .call. Pewien u've widać to:

Array.prototype.slice.call(arguments, 2); 

Jak arguments nie jest tablicą, możemy 'pożyczyć' metodę Array do korzystania z arguments. Jeśli spróbujesz zadzwonić slice na arguments dostaniesz błąd