Come faccio a passare questo contesto a una funzione?


213

Ho pensato che sarebbe stato qualcosa che avrei potuto facilmente google, ma forse non sto facendo la domanda giusta ...

Come posso impostare qualunque cosa "questo" si riferisca in una determinata funzione javascript?

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

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

Come faccio a scrivere / chiamare le mie funzioni autonome che hanno un riferimento "questo" appropriato quando sono chiamate? Uso jQuery, quindi se esiste un modo specifico di jQuery per farlo, sarebbe l'ideale.



So che questa è una vecchia domanda, ma per gli altri che atterrano qui vedi jQuery$.proxy
RyBolt il

Risposte:


303

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 puoi chiamare:

myfunc.call(obj_a);

Che avviserebbe FOO. Viceversa, passare obj_bavrebbe avvisato BAR!!. La differenza tra .call()e .apply()è che .call()accetta un elenco separato da virgole se si passano argomenti alla funzione e è .apply()necessario un array.

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

Pertanto, è possibile scrivere facilmente una funzione hookutilizzando il apply()metodo Ad esempio, vogliamo aggiungere una funzione al .css()metodo jQuerys . È possibile memorizzare il riferimento della funzione originale, sovrascrivere la funzione con un codice personalizzato e chiamare la funzione memorizzata.

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

Poiché l' argumentsoggetto magico è un array come un oggetto, possiamo semplicemente passarlo a apply(). In questo modo garantiamo che tutti i parametri vengono passati alla funzione originale.


4
Solo un bocconcino divertente: se hai bisogno di chiamare ripetutamente la funzione in riferimento obj_a, ad esempio, puoi crearne una copia con var boud_myfunc = myfunc.bind(obj_a)e semplicemente chiamare bound_myfunc()se necessario.
wbadart,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.