gpt4 book ai didi

匿名函数中的 JavaScript 上下文

转载 作者:行者123 更新时间:2023-12-03 08:25:29 26 4
gpt4 key购买 nike

我想将一个函数设置为数组中每个元素的属性,但使用不同的参数调用它。我想我会使用匿名函数来解决它:

for ( var i = 0; i < object_count; i++ ) {
objects[i].callback = function(e,x,y){ cb(e,x,y,i) };
}

但是,该函数是用 i 当时的值调用的。我将如何保留上下文?

最佳答案

您可以将赋值包装在函数中,或者至少在右侧:

    objects[i].callback = (function(i) { return function(e, x, y) {
cb(e, x, y, i);
})(i);

立即调用“外部”匿名函数,将循环变量“i”复制到一个参数中(我也将其称为“i”;有些人认为这样做令人困惑,而另一些人则认为这令人困惑不是 这样做,所以你可以决定 :-) 然后由返回的“内部”匿名函数使用。

解决此问题的另一种方法是为此目的使用效用函数而不是简单的内联匿名函数。在这种情况下,它变得有点棘手,因为您希望“i”成为实际回调函数的最后参数。 Functional JavaScript 库有一个很酷的实用程序,可以让您“预填充”具有固定值的函数的选定参数,从而为您提供一个可以将参数传递给非固定值的函数;它看起来像这样:

  objects[i].callback = (function(e, x, y, i) { return cb(e, x, y, i); }).partial(_, _, _, i);

这是好是坏取决于风格和意见。

edit 刚喝了一点咖啡 - 我认为我有点愚蠢地认为我必须使用上面的“partial()”。内部(“真实”函数)在参数列表末尾需要“i”这一事实与需要设置的方式无关。上面的例子也可以这样做:

   objects[i].callback = (function(i, e, x, y) { return cb(e, x, y, i); }).curry(i);

这就没那么奇怪了。 (然而,两者都可以。至少,我认为他们可以。:-)

关于匿名函数中的 JavaScript 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4900029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com