Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:从字符串附加事件,在闭包中计算变量_Javascript_Closures_Variable Declaration - Fatal编程技术网

Javascript:从字符串附加事件,在闭包中计算变量

Javascript:从字符串附加事件,在闭包中计算变量,javascript,closures,variable-declaration,Javascript,Closures,Variable Declaration,我肯定我问错了这个问题。我正在尝试向javascript解析器传递一个字符串,如onClick=“someFunc(arg1,arg2…” 解析器应该为带有args(arg1、arg2等)的someFunc创建onClick事件 我的问题是,当文本通过解析器时,保存someFunc字符串名称的变量的作用域将被向下传递,以便附加的事件都注册为最后声明的字符串 在下面的代码中,attributes.\u onClick可以是一个元素的字符串'onClick=“someFunc(arg1,arg2);

我肯定我问错了这个问题。我正在尝试向javascript解析器传递一个字符串,如
onClick=“someFunc(arg1,arg2…”

解析器应该为带有args(arg1、arg2等)的someFunc创建onClick事件

我的问题是,当文本通过解析器时,保存someFunc字符串名称的变量的作用域将被向下传递,以便附加的事件都注册为最后声明的字符串

在下面的代码中,attributes.\u onClick可以是一个元素的字符串'onClick=“someFunc(arg1,arg2);”,在解析器遍历该字符串时,后跟另一个元素的'onClick=“otherFunc(argA,argB);”

浏览器(Firefox V14.01)中的输出具有始终注册为otherFunc的事件函数。因此闭包中的f_name不是作为变量计算的,而是注册为整个块解析过程中声明的f_name的最后一个值

我对范围不太熟悉,不太了解我需要了解的程度。有人知道我可以用这种方式附加事件的方法吗(我试图避免在解析器之外添加事件)


您正被JavaScript中的一个陷阱绊倒,这个陷阱在某种程度上以各种不同的方式对几乎所有人造成了相同的问题

变量“f_name”在您创建的所有函数中共享。也就是说,尽管循环的每次迭代都会创建一个新函数,但只有一个“f_名称”。因此,所有函数都在其中看到相同的值,即上次迭代时的值

有几个相关的解决方案。一种方法是将建立事件处理程序的语句包装到另一个匿名函数中,您可以立即调用该匿名函数。这将允许您创建“f_name”的副本,供一个处理程序独占使用

               el.onclick = function(name) {
                return function() { window[name].apply(el,f_args) ; };
               }(f_name);

有趣的是,在这个问题上可能有数百种变体

您知道“onclick”值不必是函数调用,对吗?它可以是任何JavaScript语句。我尝试了你这里的代码,我猜我还没有完全了解你在做什么,但它对我不起作用。f_name仍仅使用上次分配的值。如果我错了,请纠正我,但是使用闭包应该“设置”变量并将其返回到外部函数?解决了它。我仍然不熟悉语法,但我使用了你的答案。非常感谢。@MagicLasso ok很高兴能提供帮助-关键是在函数中,我使用了“name”而不是“f_name”-我这样做是为了清楚地表明我使用的是副本,但这可能会让人困惑。不管怎样,我很高兴它起作用了!
               el.onclick = function(name) {
                return function() { window[name].apply(el,f_args) ; };
               }(f_name);