Javascript:附加字符串中的事件,闭包中的变量求值
Javascript: Attaching events from a string, variables evaluation in a closure
我肯定我问这个问题的方式不对。我正试图将诸如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上可能有数百种变体。
- 子类访问父类's闭包变量
- 构造函数函数闭包变量
- 如何冻结函数's在闭包中的变量
- 使变量可用于不带闭包的异步调用
- 局部变量在闭包中丢失
- 其中是闭包中存储的变量-堆栈或堆
- javascript闭包:保护内部变量
- Javascript:附加字符串中的事件,闭包中的变量求值
- "可变变量可从闭包“”访问;在传递给Array.prototype.every的函数中
- JavaScript闭包和变量引用
- Javascript分析之谜 - 闭包变量
- 对闭包变量的更改是否在使用闭包的回调中可见
- 使用object.assign()添加到对象中的getter发现闭包变量的值错误
- Javascript:为什么对闭包变量的访问可能很慢
- 模块中未更新Nodejs闭包变量
- node.js捕获闭包变量
- Javascript中绑定闭包变量
- 函数外部的Javascript闭包变量访问
- 回调函数访问闭包变量
- 为什么我的闭包变量在使用$后被清除.每个都使用JSON数据