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

我以为这是一件很容易就能搞定的事,但也许我问的问题不对……

我如何设置任何“这”指在一个给定的javascript函数?

例如,像jQuery的大多数函数,如:

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

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

203008 次浏览

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()之间的区别是,如果你要将参数传递给函数,而.apply()需要一个数组,.call()接受一个逗号分隔的列表。

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

因此,可以使用apply()方法轻松编写函数hook。例如,我们想给jquery的.css()方法添加一个特性。我们可以存储原始函数引用,用自定义代码覆盖函数并调用存储的函数。

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

由于神奇的arguments对象是一个类似数组的对象,我们可以直接将它传递给apply()。这样我们可以保证,所有的参数都传递给原始函数。

使用function.call:

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

其中that是你希望函数中的this为的对象。

jQuery使用.call(...)方法将当前节点分配给作为参数传递的函数中的this

编辑:

当你有疑问的时候,不要害怕看jQuery的代码,它都是清晰的和有良好文档的Javascript。

即:这个问题的答案在第574行左右,
callback.call( object[ name ], name, object[ name ] ) === false

可以使用绑定函数在函数中设置this的上下文。

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

另一个基本的例子:

不工作:

var img = new Image;
img.onload = function() {
this.myGlobalFunction(img);
};
img.src = reader.result;

工作:

var img = new Image;
img.onload = function() {
this.myGlobalFunction(img);
}.bind(this);
img.src = reader.result;

所以基本上:只需添加.bind(this)到你的函数