Jak przekazać ten kontekst funkcji?

Myślałem, że to będzie coś, co mógłbym łatwo wygooglować, ale może nie zadaję właściwego pytania...

Jak ustawić cokolwiek" to " odnosi się do danej funkcji javascript?

Na przykład, jak w przypadku większości funkcji jQuery, takich jak:

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

Jak napisać / wywołać własne samodzielne funkcje, które mają odpowiednie" to " odniesienie podczas wywoływania? Używam jQuery, więc jeśli istnieje specyficzny sposób na to, że jQuery, to byłoby idealne.

Author: Brian Tompsett - 汤莱恩, 2010-09-02

4 answers

JavaScript .call() i .apply() metody pozwalają ustawić kontekst dla funkcji.

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

var obj_a = {
    name:  "FOO"
};

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

Teraz możesz zadzwonić:

myfunc.call(obj_a);

Które ostrzegałyby FOO. Na odwrót, mijanie {[7] } ostrzegałoby BAR!!. Różnica między .call() i .apply() jest taka, że .call() pobiera listę rozdzieloną przecinkami, jeśli przekazujesz argumenty do swojej funkcji, a .apply() potrzebuje tablicy.

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

Dlatego możesz łatwo napisać funkcję {[13] } za pomocą metody apply(). Na przykład, chcemy dodać funkcję do metody jQuerys .css(). Możemy przechowywać oryginalne odniesienie do funkcji, nadpisać funkcję kodem niestandardowym i wywołać przechowywaną funkcję.

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

Ponieważ obiekt magiczny arguments jest obiektem podobnym do tablicy, możemy go po prostu przekazać apply(). W ten sposób gwarantujemy, że wszystkie parametry są przekazywane do oryginalnej funkcji.

 260
Author: jAndy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-24 04:21:24

Użycie :

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

Gdzie that jest obiektem, który ma być this w funkcji.

 41
Author: palswim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-15 00:59:38

JQuery używa metody .call(...) do przypisania bieżącego węzła do this wewnątrz funkcji, którą przekazujesz jako parametr.

EDIT:

Nie bój się zajrzeć do kodu jQuery, gdy masz wątpliwości, wszystko jest w jasnym i dobrze udokumentowanym Javascript.

Ie: odpowiedź na to pytanie jest wokół linii 574,
callback.call( object[ name ], name, object[ name ] ) === false

 15
Author: Mic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-02 18:49:03

Możesz użyć funkcji bind , Aby ustawić kontekst this wewnątrz funkcji.

function myFunc() {
  console.log(this.str)
}
const myContext = {str: "my context"}
const boundFunc = myFunc.bind(myContext);
boundFunc(); // "my context"
 2
Author: Scott Jungwirth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-15 18:11:25