2013-03-28 17 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 

L'uso di bind e call/applica ha un aspetto molto simile, voglio sapere qual è la differenza tra di loro. La funzione getX di cui sopra è la stessa?qual è la differenza tra "call/apply" e "bind"

+0

Controllare http://stackoverflow.com/questions/1986896/what-is-the-difference- between betweencall -e-apply o http://stackoverflow.com/questions/15455009/js-call-apply-vs-bind – Rakesh

risposta

37

bind restituisce una funzione che si comporta come la funzione originale ma con this predefinita. Viene in genere utilizzato quando si desidera passare una funzione a un gestore eventi o ad altri callback asincroni.

call e apply chiamerà immediatamente una funzione che consente di specificare sia il valore di this sia gli argomenti che la funzione riceverà.

Il secondo esempio definisce una funzione anonima che chiama apply. Questo è un modello comune; bind fornisce un'implementazione standard di ciò che consente di farlo con una semplice chiamata di funzione (quindi essere più veloce e più facile da scrivere).

+4

Inoltre, è possibile specificare argomenti nella chiamata 'bind()' che verrà anteposta all'elenco degli argomenti quando chiami la funzione risultante, ad es 'function add (a, b) {return a + b}; var plus5 = add.bind (null, 5); console.log (plus5 (6)/* 11 * /) ' – thejh

33

.call() - chiama la stessa funzione con gli argomenti specificati

.apply() - chiama la stessa funzione con gli argomenti specificati in una matrice

.bind() - crea una nuova funzione con lo stesso corpo della funzione, con un predefinito valore di this (il primo argomento) e restituisce tale funzione.

In tutti i casi, il primo argomento viene utilizzato come valore di this all'interno della funzione.

+1

Come puoi parlare di' call', 'apply' e' bind' senza discutere 'this' ?! –

+0

@ T.J.Crowder - Aggiunto anche questo bit .. :) – techfoobar

+0

'' bind() '' non chiama la funzione. Prendi in considerazione la riformulazione. – lqc

5

La differenza è come si effettua la chiamata. Se hai utilizzato bind di tornare una funzione con un valore associato this, basta chiamare la funzione:

getx(); 

Se non si dispone di una funzione legata, e si desidera impostare this, lo si fa con call o apply:

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

si noti che se si dispone di una funzione legata (come il tuo getX), utilizzando call su di esso è inutile, perché il this che verranno inseriti solo ottenere ignorato dalla legata this . (Utilizzare apply potrebbe essere ancora utile, se si dispone di un array di valori che si desidera ass come argomenti.)

+0

'apply' non è inutile perché potresti avere una matrice di argomenti e non puoi invocarla direttamente. – Neil

+0

@Neil: Ok, punto giusto. –

Problemi correlati