我如何将这个上下文传递给一个函数?

我认为这将是我可以轻松谷歌,但也许我不是问正确的问题…

如何在给定的JavaScript函数中设置“this”引用的内容?

比如像jQuery的大部分函数一样,比如:

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

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

Javascripts .apply() .call().apply()方法允许你设置一个函数的上下文

 var myfunc = function(){ alert(this.name); }; var obj_a = { name: "FOO" }; var obj_b = { name: "BAR!!" }; 

现在你可以打电话给:

 myfunc.call(obj_a); 

哪个会提醒FOOobj_b ,传递obj_b会提醒BAR!!.apply() .call().apply()之间的区别在于.apply()采用逗号分隔的列表,如果你传递参数给你的函数和.apply()需要一个数组。

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

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

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

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

用途 :

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

哪里是你想要在这个函数中的对象。

jQuery使用.call(...)方法将当前节点分配给您作为parameter passing的函数内部。

编辑:

当你有疑问的时候,不要害怕去查看jQuery的代码,这一切都是清晰的和有据可查的Javascript。

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

你可以使用bind函数在函数中设置它的上下文。

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