如何使javascript字符串成为函数调用

时间:2017-02-11 16:30:49

标签: javascript jquery angularjs jquery-ui

我有字符串logo.cr.Button和函数

logo.cr.Button = function(){
 //something
}

var strg = 'logo.cr.Button';
strg();

现在不知怎的,我必须使该字符串成为函数调用

strg();类似,但它正在说

  

strg不是构造函数

这里

4 个答案:

答案 0 :(得分:1)

这不起作用,因为JavaScript认为您使用点表示法。当您编写logo.cr.Button()时,JavaScript正在对象Button()中的对象cr中查找函数logo

我建议将名称更改为logoCrButton = function()...

答案 1 :(得分:1)

您可以使用eval,但不建议这样做。 Secury问题只是一个原因,因为用户可能利用eval来执行不应该执行的不同代码。在this个问题中,我们会对其进行全面解释。



var logo={cr:{}};
logo.cr.Button = function(){
  console.log("something");
}

var string = "logo.cr.Button()";
eval(string);




如果可以避免 eval ,则使用普通函数调用,对象或数组。相反,与动态评估某些参数相比,迭代数组会更好,更稳定,如您所见[{3}}。

第二个示例不使用 eval ,但是您可以使用字符串调用某个函数:



var obj={logo:{cr:{Button:function(){console.log("something");}}}};

var string = "logo.cr.Button";

function callFunctionByString(string,obj){
  var parts = string.split('.');
  parts.forEach(function(part){
    obj = obj[part];
  });
  obj();
}

callFunctionByString(string,obj);




希望这有帮助。

答案 2 :(得分:1)

使用eval(“logo.cr.Button”)();

这将执行该功能,当然如果你有一个像这样的对象:

var logo = {
    cr: {

    }
};

答案 3 :(得分:1)

通常,当我们编写JavaScript函数时,生成的函数声明如下所示:

function demo() {
  // function stuff here
}

你可能不仅仅意识到“在JavaScript函数中是一流的对象”。这是一个随处可见的短语,并且有充分的理由。这是一个非常强大的想法,它将JavaScript提升到了原来的位置。我们不会在这里讨论一流物体的细节。我们所关心的是,在JavaScript中,函数是对象。 这意味着也可以通过调用其构造函数声明上述函数:

var demo = new Function();

现在假设我们有一个带参数和指令的函数:

function demo(name, age) {
  console.log('my name is ' + name);
  console.log('my age is ' + age);
}

现在将其转换为Constructor语法:

var demo = new Function(
  "name,age",
  "console.log('my name is ' + name);" + 
  "console.log('my age is ' + age);"
);

这使得很容易看出这两个函数是相同的,它们只是以不同的方式声明。重要的区别在于,人们可以轻松访问我们应该能够操作的字符串。

这以非常类似的方式适用于您的功能。

var strfunc = new Function ("", "logo.cr.Button()");

我似乎无法格式化,因为我在移动设备上。但我会尽快。