Javascript函数名称作为自执行函数中的字符串

时间:2010-11-05 19:23:31

标签: javascript

我在javascript中运行一个自执行函数,不会干扰页面上的任何全局变量。我有一个字符串,其中包含我要调用的函数的名称。该函数在我的自执行函数中声明。有没有办法通过使用字符串调用该函数?

(function(document, window){
    var functionName = "myFunction";

    window[functionName](); //This does not work...        

    function myFunction(){
        //Do some stuff
    }

}(document, window)

我发现了这个:How to execute a JavaScript function when I have its name as a string

但是我的函数是自动执行而没有名字,所以我无法用窗口变量引用它。

8 个答案:

答案 0 :(得分:4)

这只是其他人所建议的更清晰的版本,没有全局污染,没有评估,也没有模糊的变量引用(arguments.callee和“this”)。

// Not sure why you were passing in doc and window, so I took it out for clarity
(function(){
    var funcs = {
      funcA: function () { return "a"},
      funcB: function () { return "b"}
    };

    var functionName = "funcA";
    funcs[functionName]();  
}();

这种方法确实要求您在使用它们之前声明这些函数。

答案 1 :(得分:3)

没有全球污染,避免使用非严格的arguments.callee方法。

基于this answer

// This Immediately Invoked Function Expression is invoked via `call`.
// call() takes 1 or more arguments: the first being the scope you want the 
// invoked function be in; the other arguments become arguments of the function
// itself.
// In this case, the scope of our function is an empty object ({}).
// This object allows us to attach functions using the this.* syntax and call the 
// functions with this["string"]() without ever polluting the global namespace. 
// It is also forward compatible with ECMAScript 5's scrict-mode as it does not
// use arguments.callee.
(function(document, window){
    var functionName = "myFunction";

    // you'll need to define the function _before_ you call it.
    this.myFunction = function(){
        //Do some stuff
        alert('me');
    };


    this[functionName]();

}.call({}, document, window));

答案 2 :(得分:1)

您可以使用eval(functionName + "()"),因为window的任何功能也是全局功能。

答案 3 :(得分:1)

您可以将myFunction函数存储在某处(例如 this 一个新对象)吗?

请参阅jsFiddle example

(function (document, window){
    var functionName = "myFunction",
        myFunctions = {
            myFunction: function() { alert('myFunction'); }
        };

    myFunctions[functionName]();
}(document, window));

答案 4 :(得分:1)

如果您在调用之前不介意定义该功能,可以使用arguments.callee。这避免了eval。

(function (){
  arguments.callee.f = function() {
    console.log('test');
  };
  arguments.callee['f']();
})();

答案 5 :(得分:0)

你是对的。这是因为您的函数是在自执行函数中定义的。窗户不了解内部封闭。你能做的最好的可能就是eval:

a la:

eval(functionName + "();");

,在这种情况下可能不是那么邪恶:When is JavaScript's eval() not evil?

答案 6 :(得分:0)

尝试: functionName.apply(contextarguments) 要么 functionName.call(context [,argument 1argument 2,...])(view reference

或者(作为下面提到的海报)你可以将函数添加到窗口命名空间中的对象:

var newObj = {}; newObj.myFunction = function(){// stuff}

newObj.myFunction(); //调用新函数

答案 7 :(得分:0)

我想我无法评论答案,所以我必须以这种方式发布。 Eval对我来说太危险了,因为实际的函数名是由用户以字符串形式给出的。