2010-09-02 13 views
162

Ho pensato che sarebbe stato qualcosa che avrei potuto facilmente google, ma forse non sto chiedendo la domanda giusta ...Come posso passare questo contesto a una funzione?

Come faccio a impostare qualsiasi cosa "questo" si riferisce a una determinata funzione javascript?

per esempio, come con la maggior parte delle funzioni di jQuery, quali:

$(selector).each(function() { 
    //$(this) gives me access to whatever selector we're on 
}); 

Come faccio a scrivere/chiamo il mio funzioni autonome che hanno un adeguato "questo" di riferimento quando viene chiamato? Io uso jQuery, quindi se c'è un modo specifico di jQuery per farlo, sarebbe l'ideale.

+0

Eventuali duplicati: http://stackoverflow.com/questions/520019/controlling-the-value-of-this-in-a-jquery-event/520417#520417 – user123444555621

+0

So che questa è una vecchia questione , ma per gli altri che atterrano qui vedi jQuery '$ .proxy' – RyBolt

risposta

240

Javascripts .call() e .apply() metodi consentono di impostare il contesto per una funzione.

var myfunc = function(){ 
    alert(this.name); 
}; 

var obj_a = { 
    name: "FOO" 
}; 

var obj_b = { 
    name: "BAR!!" 
}; 

Ora è possibile chiamare:

myfunc.call(obj_a); 

Che sarebbe avvisare FOO. Il contrario, passando obj_b avverte BAR!!. La differenza tra .call() e .apply() è che .call() prende un elenco separato da virgole se si passano argomenti alla propria funzione e .apply() ha bisogno di un array.

myfunc.call(obj_a, 1, 2, 3); 
myfunc.apply(obj_a, [1, 2, 3]); 

Pertanto, si può facilmente scrivere una funzione hook utilizzando il metodo apply(). Ad esempio, vogliamo aggiungere una funzione al metodo jQuerys .css(). Possiamo memorizzare il riferimento alla funzione originale, sovrascrivere la funzione con un codice personalizzato e richiamare la funzione memorizzata.

var _css = $.fn.css; 
$.fn.css = function(){ 
    alert('hooked!'); 
    _css.apply(this, arguments); 
}; 

Poiché la magia arguments oggetto è un array come oggetto, possiamo solo passare a apply(). In questo modo garantiamo che tutti i parametri sono passati alla funzione originale.

+2

Solo un divertente tidbit: se hai bisogno di chiamare ripetutamente la funzione in riferimento a' obj_a', per esempio, puoi crearne una copia con 'var boud_myfunc = myfunc .bind (obj_a) 'e chiama semplicemente' bound_myfunc() 'secondo necessità. – Will

37

Use:

_function.call(that, arg1, arg2, etc); 

Dove that è l'oggetto che si desidera this nella funzione di essere.

+0

'function' è una parola chiave riservata; considera l'aggiornamento della risposta per includere una funzione con nome poiché 'function.call (...)' non è un JavaScript valido. –

+0

@DanielAllen: Senza la definizione di qualsiasi nome di funzione di esempio che fornirei, il codice genererà comunque un errore JS. Ma ho aggiornato il nome della funzione di esempio. – palswim

14

jQuery utilizza un metodo .call(...) per assegnare il nodo corrente a this all'interno della funzione passata come parametro.

EDIT:

Non abbiate paura di guardare dentro il codice jQuery quando si ha un dubbio, è tutto in modo chiaro e ben documentato Javascript.

cioè: la risposta a questa domanda è intorno alla linea 574,
callback.call(object[ name ], name, object[ name ]) === false

1

È possibile utilizzare la funzione bind per impostare il contesto di this all'interno di una funzione.

function myFunc() { 
    console.log(this.str) 
} 
const myContext = {str: "my context"} 
const boundFunc = myFunc.bind(myContext); 
boundFunc(); // "my context" 
Problemi correlati