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

How do I pass the this context to a function?

提问人:user126715 提问时间:9/3/2010 最后编辑:Brian Tompsett - 汤莱恩user126715 更新时间:10/24/2019 访问量:221487

问:

我以为这是我可以很容易地用谷歌搜索的东西,但也许我没有问正确的问题......

如何在给定的 javascript 函数中设置“this”所指的内容?

例如,与大多数jQuery的函数一样,例如:

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

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

javascript jquery 作用域

评论

0赞 user123444555621 9/3/2010
可能的重复:stackoverflow.com/questions/520019/...
0赞 RyBolt 7/15/2016
我知道这是一个老问题,但对于其他人,请参阅jQuery$.proxy

答:

350赞 jAndy 9/3/2010 #1

Javascript 和方法允许您设置函数的上下文.call().apply()

var myfunc = function(){
    alert(this.name);
};

var obj_a = {
    name:  "FOO"
};

var obj_b = {
    name:  "BAR!!"
};

现在您可以调用:

myfunc.call(obj_a);

这会提醒.反之亦然,路过会发出警报。和之间的区别在于,如果要将参数传递给函数并且需要数组,则采用逗号分隔的列表。FOOobj_bBAR!!.call().apply().call().apply()

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

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

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

由于魔术对象是一个类似数组的对象,我们可以将其传递给 。这样,我们就可以保证所有参数都传递到原始函数。argumentsapply()

评论

6赞 wbadart 11/15/2016
只是一个有趣的花絮:例如,如果您需要引用 重复调用该函数,您可以使用它创建副本并根据需要简单地调用。obj_avar boud_myfunc = myfunc.bind(obj_a)bound_myfunc()
58赞 palswim 9/3/2010 #2

使用 function.call

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

您希望在函数中存在的对象在哪里。thatthis

评论

2赞 Daniel Allen 9/14/2017
function是保留关键字;请考虑更新响应以包含命名函数,因为该函数不是有效的 JavaScript。function.call(...)
1赞 palswim 9/15/2017
@DanielAllen:如果没有我提供的任何示例函数名称的定义,代码仍然会抛出 JS 错误。但是,我更新了示例函数名称。
0赞 Or Assayag 9/19/2023
像魔术一样工作,非常感谢!
17赞 Mic 9/3/2010 #3

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

编辑:

当你有疑问时,不要害怕查看jQuery的代码,这一切都在清晰且有据可查的Javascript中。

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

31赞 Scott Jungwirth 6/16/2017 #4

可以使用 bind 函数在函数中设置上下文。this

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

评论

2赞 Dave F 12/21/2021
我怀疑这个目前正确答案的答案是否会获得最多的选票。应该有一个选项可以查看答案,其中根据经过的时间对赞成票进行加权。
37赞 Joery 3/19/2019 #5

另一个基本示例:

不工作:

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) 添加到您的函数中

评论

2赞 nenea 4/18/2019
这应该是公认的答案。语法简单多了,头脑也轻松多了......干得好乔里