我如何将这个上下文传递给一个函数?
我认为这将是我可以轻松谷歌,但也许我不是问正确的问题…
如何在给定的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);
哪个会提醒FOO
。 obj_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"