Tim*_*Tim 2 javascript scope anonymous-function
我想将一个函数设置为数组中每个元素的属性,但是使用不同的参数调用它.我以为我会用匿名函数解决它:
for ( var i = 0; i < object_count; i++ ) {
objects[i].callback = function(e,x,y){ cb(e,x,y,i) };
}
Run Code Online (Sandbox Code Playgroud)
但是,使用当时具有的值调用该函数i.我如何保留上下文?
Poi*_*nty 10
您可以将赋值包装在函数中,或至少包含在右侧:
objects[i].callback = (function(i) { return function(e, x, y) {
cb(e, x, y, i);
})(i);
Run Code Online (Sandbox Code Playgroud)
"外"匿名函数被调用向右走,复制循环变量"i"为参数(这也是我所谓的"我";有的认为这是混淆要做到这一点,而其他人说这混乱不这样做,这样你就可以决定:-)然后由返回的"内部"匿名函数使用.
解决此问题的另一种方法是使用实用程序函数来代替简单的内联匿名函数.在这种情况下,它有点棘手,因为你希望"i"成为实际回调函数的最后一个参数.该功能的JavaScript库有一个很酷的工具,可以让一个函数的你"预填充"选定的参数具有固定值,给你一个功能,可以让你在参数非固定的人通过; 它看起来像这样:
objects[i].callback = (function(e, x, y, i) { return cb(e, x, y, i); }).partial(_, _, _, i);
Run Code Online (Sandbox Code Playgroud)
无论是好还是坏都是风格和观点的问题.
编辑只是喝了一点咖啡 - 我觉得我有点傻了,以为我不得不使用上面的"部分()".内部("真实"函数)在参数列表的末尾想要"i"的事实与需要设置事物的方式无关.上面的例子也可以这样做:
objects[i].callback = (function(i, e, x, y) { return cb(e, x, y, i); }).curry(i);
Run Code Online (Sandbox Code Playgroud)
这不那么奇怪.(要么会工作.至少,我认为他们会.:-)