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

标签 javascript closures variable-declaration

我确信我以错误的方式问了这个问题。我正在尝试将诸如 onClick="someFunc(arg1,arg2...)" 之类的字符串传递给 JavaScript 解析器。

解析器应该为 someFunc 创建一个带有参数(arg1、arg2 等)的 onClick 事件。

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

在下面的代码中,attributes._onClick 可以是字符串 'onClick="someFunc(arg1,arg2);"对于一个元素,后跟 'onClick="otherFunc(argA,argB);"当解析器在字符串中移动时获取另一个元素。

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

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

           temp = attributes._onClick ;
            var x = 0 ;
            var f_name,f_args ;
            while(temp[x] != '') {
                temp[x] = temp[x].replace(')','').split('(') ;//remove paranthesis and separate func name from args
                f_name = temp[x][0] ;
                f_args = temp[x][1].split(',') ;//turn string of args into array
                el.onclick = function() { window[f_name].apply(el,f_args) ; }
                x++ ;
            }

最佳答案

您遇到了 JavaScript 中的一个陷阱,该陷阱在某些时候以各种不同的方式导致几乎每个人都遇到同样的问题。

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

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

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

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

关于Javascript:从字符串附加事件,在闭包中评估变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11746120/

相关文章:

groovy 中闭包的序列化

rust - 如何从 Rust 的闭包内部跳过循环迭代?

perl - 使用 Perl 在循环中声明变量

javascript - Bootstrap datetimepicker 在 Bootstrap Collapse 内部时不触发

javascript - 在服务器和客户端上渲染时应如何处理日期字符串?

javascript - Bing Maps v7 图钉 htmlContent 导致事件在不可见时变为未绑定(bind)

php - 匿名函数/闭包和使用 self::or static::

javascript - 如何将js文件包含到Velocity模板中?

c# - 是否有可能在 Visual Basic 中收到 "use of uninitialized local variable"警告?

Java语法变量声明产生式规则