提问人:user126715 提问时间:9/3/2010 最后编辑:Brian Tompsett - 汤莱恩user126715 更新时间:10/24/2019 访问量:221487
如何将此上下文传递给函数?
How do I pass the this context to a function?
问:
我以为这是我可以很容易地用谷歌搜索的东西,但也许我没有问正确的问题......
如何在给定的 javascript 函数中设置“this”所指的内容?
例如,与大多数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]);
因此,您可以使用该方法轻松编写函数。例如,我们想向 jQuerys 方法添加一个功能。我们可以存储原始函数引用,用自定义代码覆盖函数并调用存储的函数。hook
apply()
.css()
var _css = $.fn.css;
$.fn.css = function(){
alert('hooked!');
_css.apply(this, arguments);
};
由于魔术对象是一个类似数组的对象,我们可以将其传递给 。这样,我们就可以保证所有参数都传递到原始函数。arguments
apply()
评论
obj_a
var boud_myfunc = myfunc.bind(obj_a)
bound_myfunc()
var f = function () { console.log(this); }
f.call(that, arg1, arg2, etc);
您希望在函数中存在的对象在哪里。that
this
评论
function
是保留关键字;请考虑更新响应以包含命名函数,因为该函数不是有效的 JavaScript。function.call(...)
jQuery使用一种方法将当前节点分配给作为参数传递的函数内部。.call(...)
this
编辑:
当你有疑问时,不要害怕查看jQuery的代码,这一切都在清晰且有据可查的Javascript中。
IE:这个问题的答案在第 574 行左右,
callback.call( object[ name ], name, object[ name ] ) === false
可以使用 bind 函数在函数中设置上下文。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) 添加到您的函数中
评论
$.proxy