我很肯定我以错误的方式问这个问题。我试图将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++ ;
}
答案 0 :(得分:0)
你正在绊倒JavaScript中的一个陷阱,在某些时候几乎每个人都以不同的方式导致同样的问题。
您正在创建的所有功能中的变量“f_name”是共享。也就是说,虽然循环的每次迭代都会创建一个新函数,但只有一个“f_name”。因此,所有函数都看到相同的值,即它在上一次迭代中的值。
有几个相关的解决方案。一种方法是在另一个匿名函数中包装建立事件处理程序的语句,您可以立即调用该函数。这将允许您创建“f_name”的副本,供一个处理程序独占使用。
el.onclick = function(name) {
return function() { window[name].apply(el,f_args) ; };
}(f_name);
有趣的是,这个问题上可能存在数百种变体。