2013-03-28 9 views
32
var obj = { 
    x: 81, 
    getX: function() { 
    console.log(this.x) 
    } 
}; 
var getX = obj.getX.bind(obj);//use obj as 'this'; 
getX();//81 
var getX = function(){ 
    obj.getX.apply(obj); 
} 
getX();//also 81 

Zastosowanie wiążą i zadzwonić/zastosowanie wyglądają bardzo podobnie, chcę wiedzieć, jaka jest różnica między them.The dwa getX Funkcja powyżej jest taka sama?jaka jest różnica między „wezwanie/zastosowanie” i „związać”

+0

Sprawdź http://stackoverflow.com/questions/1986896/what-is-the-difference-between-call i zastosuj lub http://stackoverflow.com/questions/15455009/js-call-apply-vs-bind – Rakesh

Odpowiedz

37

bind zwraca funkcję, która będzie działać jak oryginalna funkcja, ale z wstępnie zdefiniowaną this. Jest zwykle używany, gdy chcesz przekazać funkcję do obsługi zdarzenia lub innego asynchronicznego wywołania zwrotnego.

i apply wywoła funkcję natychmiast pozwalając określić zarówno wartość this jak i wszelkie argumenty, które funkcja otrzyma.

Twój drugi przykład definiuje anonimową funkcję, która wywołuje apply. To jest wspólny wzorzec; bind zapewnia standardową implementację tego, co pozwala to zrobić za pomocą prostego wywołania funkcji (dzięki czemu jest szybsze i łatwiejsze do napisania).

+4

Możesz także podać argumenty w wywołaniu 'bind()', które zostanie dodane do listy argumentów, gdy wywołuje się wynikową funkcję, np 'function add (a, b) {return a + b}; var plus5 = add.bind (null, 5); console.log (plus5 (6)/* 11 * /) ' – thejh

33

.call() - wywołuje tę samą funkcję z określonymi argumentami

.apply() - wywołuje tę samą funkcję z argumentów podanych w tablicy

.bind() - tworzy nową funkcję o tej samej treści funkcji, z zadaną wartość this (pierwszy argument) i zwraca tę funkcję.

We wszystkich przypadkach pierwszy argument jest używany jako wartość this wewnątrz funkcji.

+1

Jak możesz mówić o' call', 'apply' i' bind' bez omawiania 'this' ?! –

+0

@ T.J.Crowder - Dodano to trochę .. :) – techfoobar

+0

'' bind() '' nie wywołuje funkcji. Zastanów się nad powtórzeniem tego. – lqc

5

Różnica polega na tym, jak wykonać połączenie. Jeśli używany bind wrócić funkcji związanej z wartością this, wystarczy wywołać funkcję:

getx(); 

Jeśli nie masz związanego funkcję, a chcesz ustawić this, to zrobić z call lub apply:

someFunction.call(objectToUseAsThis, arg1, arg2); 
// or 
someFunction.apply(objectToUseAsThis, [arg1, arg2]); 

pamiętać, że jeśli masz związanego funkcji (jak twój getX), stosując call na to nie ma sensu, ponieważ this podasz będzie po prostu zastąpione przez związaną this . (Używanie apply może być nadal przydatne, jeśli masz tablicę wartości, które chcesz przypisać jako argumenty.)

+0

'apply' nie jest bezcelowe, ponieważ możesz mieć tablicę argumentów i nie możesz tego wywołać bezpośrednio. – Neil

+0

@Neil: Okay, fair point. –

Powiązane problemy