Javascript:从字符串中附加事件,在闭包中进行变量求值

时间:2012-07-31 17:52:49

标签: javascript closures variable-declaration

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

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

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

在下面的代码中,attributes._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++ ;
            }

1 个答案:

答案 0 :(得分:0)

你正在绊倒JavaScript中的一个陷阱,在某些时候几乎每个人都以不同的方式导致同样的问题。

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

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

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

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