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

IT技术 javascript jquery scope this
2021-01-26 19:07:41

我认为这将是我可以轻松谷歌搜索的东西,但也许我没有问正确的问题......

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

例如,像大多数 jQuery 的功能一样,例如:

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

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

5个回答

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]);

因此,您可以hook使用该apply()方法轻松编写函数例如,我们想向 jQuerys.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()根据需要简单地调用
2021-03-31 19:07:41

使用function.call

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

that您希望this函数中的对象在哪里

function是保留关键字;考虑更新您的响应以包含命名函数,因为function.call(...)它不是有效的 JavaScript。
2021-03-20 19:07:41
@DanielAllen:如果没有我提供的任何示例函数名称的定义,代码仍然会抛出一个 JS 错误。但是,我更新了示例函数名称。
2021-04-03 19:07:41

另一个基本示例:

不工作:

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

这应该是公认的答案。更简单的语法,更容易记住...干得好乔里
2021-03-12 19:07:41

您可以使用绑定函数来设置this函数内的上下文

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

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

编辑:

当您有疑问时,不要害怕查看 jQuery 的代码,所有内容都在清晰且有据可查的 Javascript 中。

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