Как передать этот контекст функции?
Я думал, что это будет то, что я мог бы легко google, но, возможно, я не задаю правильный вопрос...
Как установить, что" это " относится к данной функции javascript?
например, как и большинство функций jQuery, таких как:
$(selector).each(function() {
//$(this) gives me access to whatever selector we're on
});
Как написать / вызвать мои собственные автономные функции, которые имеют соответствующую ссылку "this" при вызове? Я использую jQuery, поэтому, если есть jQuery-специфический способ сделать это, это будет идеальный.
4 ответов
Javascripts .call()
и .apply()
методы позволяют установить контекст для функции.
var myfunc = function(){
alert(this.name);
};
var obj_a = {
name: "FOO"
};
var obj_b = {
name: "BAR!!"
};
теперь вы можете позвонить:
myfunc.call(obj_a);
который предупредит FOO
. Наоборот, проходя мимо!--7--> предупредить 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);
};
С Magic
jQuery использует .call(...)
метод назначения текущего узла this
внутри функции вы передаете в качестве параметра.
EDIT:
не бойтесь заглянуть внутрь кода jQuery, когда у вас есть сомнения, все это в ясном и хорошо документированном Javascript.
ie: ответ на этот вопрос находится вокруг строки 574,callback.call( object[ name ], name, object[ name ] ) === false
можно использовать bind функция для установки контекста this
внутри функции.
function myFunc() {
console.log(this.str)
}
const myContext = {str: "my context"}
const boundFunc = myFunc.bind(myContext);
boundFunc(); // "my context"