Как передать этот контекст функции?

Я думал, что это будет что-то, что я мог бы легко Google, но, возможно, я не задаю правильный вопрос...

Как установить значение "this" в данной функции javascript?

например, как и большинство функций jQuery, таких как:

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

Как мне написать/вызвать мои собственные автономные функции, которые имеют соответствующую ссылку "this" при вызове? Я использую jQuery, поэтому, если есть конкретный способ выполнения jQuery, это было бы идеально.

Ответ 1

Javascripts .call() и .apply() позволяют вам установить контекст для функции.

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

var obj_a = {
    name:  "FOO"
};

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

Теперь вы можете позвонить:

myfunc.call(obj_a);

Что будет предупреждать FOO. Другой способ, проходящий obj_b, будет предупреждать BAR!!. Разница между .call() и .apply() заключается в том, что .call() принимает список, разделенный запятыми, если вы передаете аргументы своей функции, а .apply() нужен массив.

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

Поэтому вы можете легко написать функцию hook с помощью метода apply(). Например, мы хотим добавить функцию в метод jQuerys .css(). Мы можем сохранить исходную ссылку на функцию, перезаписать функцию с помощью специального кода и вызвать хранимую функцию.

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

Поскольку магический объект arguments является массивом, подобным объекту, мы можем просто передать его в apply(). Таким образом мы гарантируем, что все параметры передаются исходной функции.

Ответ 2

Использовать:

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

Где that - это объект, который вы хотите this в функции.

Ответ 3

jQuery использует метод .call(...) для назначения текущего node this внутри функции, которую вы передаете в качестве параметра.

EDIT:

Не бойтесь заглядывать в код jQuery, если у вас есть сомнения, все это в ясном и хорошо документированном Javascript.

т.е. ответ на этот вопрос находится вокруг строки 574,
callback.call( object[ name ], name, object[ name ] ) === false

Ответ 4

Вы можете использовать функцию bind, чтобы установить контекст this внутри функции.

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