我以为这是一件很容易就能搞定的事,但也许我问的问题不对……
我如何设置任何“这”指在一个给定的javascript函数?
例如,像jQuery的大多数函数,如:
$(selector).each(function() {
//$(this) gives me access to whatever selector we're on
});
我如何编写/调用自己的独立函数时,有一个适当的“this”引用调用?我使用jQuery,所以如果有一个特定于jQuery的方式来做它,那将是理想的。
javascript .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()之间的区别是,.call()接受一个逗号分隔的列表,如果你将参数传递给你的函数,而.apply()需要一个数组。
myfunc.call(obj_a, 1, 2, 3);
myfunc.apply(obj_a, [1, 2, 3]);
因此,您可以通过使用apply()方法轻松地编写函数钩子。例如,我们想向jquery .css()方法添加一个特性。我们可以存储原始函数引用,用自定义代码覆盖函数并调用存储的函数。
var _css = $.fn.css;
$.fn.css = function(){
alert('hooked!');
_css.apply(this, arguments);
};
由于magic arguments对象是一个类似object的数组,我们可以直接将它传递给apply()。这样我们可以保证,所有的参数都传递给原始函数。