Javascript将字符串转换为函数名
可能重复:Javascript将字符串转换为函数名,javascript,Javascript,可能重复: 我有以下代码: var Functionify = function() { return { init: function(el, t) { var els = document.getElementsByClassName(el); var elsL = els.length; while(elsL--){ //els[elsL].onclic
我有以下代码:
var Functionify = function() {
return {
init: function(el, t) {
var els = document.getElementsByClassName(el);
var elsL = els.length;
while(elsL--){
//els[elsL].onclick = els[elsL].getAttribute(t);
els[elsL].addEventListener('click', els[elsL].getAttribute(t), false);
}
}
};
}();
其中el='myClassName'
和t='dataid'
现在,“t”是一个字符串,如何告诉addEventListener函数使用“t”(字符串)作为函数名?使用eval()函数
例如:
a = "alert(1)"
eval(a)
我不知道你为什么要这样做,如果函数是全局范围的一部分,你可以使用括号表示法
window["stringName"]();
在全局命名空间中,您可以执行以下操作:
this.test = function() {
alert('test');
}
window['test']();
然而,更好的选择是使函数成为您创建的对象的方法,而不是全局
窗口对象的方法。使用eval()被认为是“邪恶的”,特别是在Danila给出的示例中——任何JS片段都可以在eval()中执行。如epascarello所述,最好的选择是使用方括号表示法调用命名函数。但是,需要注意的是,windowt将调用全局命名空间中的函数——如果函数是对象的方法,则应引用该函数。这可能有潜在危险。@dqhendricks:(我知道你说的“潜在”,仍然是…)仅当a
是包含JavaScript的字符串时,从服务器接收并由恶意用户注入。如果您使用自己的代码,这很好,尽管不是一个很好的解决方案。我想您的意思是说els[elsL].getAttribute(t)
是一个字符串和变量/函数的名称。否则,getAttribute(t)
就没有意义了。@TheEliteNoob:重复得好!