Javascript:附加字符串中的事件,闭包中的变量求值

Javascript: Attaching events from a string, variables evaluation in a closure

本文关键字:闭包 变量 事件 字符串 Javascript      更新时间:2023-09-26

我肯定我问这个问题的方式不对。我正试图将诸如onClick="someFunc(arg1,arg2...)"之类的字符串传递给javascript解析器。

解析程序应为参数为(arg1、arg2等)的someFunc创建onClick事件。

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

在下面的代码中,属性_onClick可以是字符串'onClick="someFunc(arg1,arg2);"(对于一个元素),然后是'onClick="otherFunc(argA,argB);",用于另一个元素,因为解析器在该字符串中移动。

浏览器(Firefox V14.01)中的输出具有始终注册为otherFunc的事件功能。因此,闭包中的f_name不是作为变量计算的,而是在解析整个块的过程中注册为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上可能有数百种变体。