如何将此上下文传递给函数?

2022-08-30 00:44:59

我以为这将是我可以很容易地谷歌的东西,但也许我没有问正确的问题......

如何在给定的javascript函数中设置“this”所指的任何内容?

例如,与大多数jQuery的函数一样,例如:

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

如何编写/调用自己的独立函数,这些函数在调用时具有适当的“this”引用?我使用jQuery,所以如果有一个特定于jQuery的方法,那将是理想的。


答案 1

Javascript和方法允许您设置函数的上下文.call().apply()

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

var obj_a = {
    name:  "FOO"
};

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

现在,您可以致电:

myfunc.call(obj_a);

这会提醒 .反之亦然,路过会提醒。和 之间的区别在于,如果您要将参数传递给函数并需要一个数组,则采用逗号分隔的列表。FOOobj_bBAR!!.call().apply().call().apply()

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

因此,您可以使用该方法轻松编写函数。例如,我们想要向jQuerys方法添加一个功能。我们可以存储原始函数引用,用自定义代码覆盖函数并调用存储的函数。hookapply().css()

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

由于魔术对象是一个类似数组的对象,我们可以将其传递给 。这样,我们保证所有参数都传递到原始函数。argumentsapply()


答案 2

使用函数.调用

var f = function () { console.log(this); }
f.call(that, arg1, arg2, etc);

where 是您希望在函数中成为的对象。thatthis