Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript将字符串转换为函数名_Javascript - Fatal编程技术网

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:重复得好!