在javascript中将字符串转换为函数

时间:2011-11-24 22:18:27

标签: javascript string function casting

我已经做了一些谷歌搜索,但这个特殊问题有点太类似于“如何评估字符串中的函数名称”所以我找不到解决方案,我想将字符串转换为一个函数所以说我有类似的东西:

for (var i = 0; i < someNumber ; i++) {
    var foo = "function() { someObject.someOtherFunctionCall(" + i + ") }";
    someArray[i] = foo;
}

我如何对foo进行类型转换,以便我可以调用

someArray[0]();

我需要在函数中添加值,任何想法?

编辑:我只是为“i”代替“值”代表混淆道歉

更新

好的,我接受了icktoofay的回答,因为它有效,回答了你的大多数问题和疑虑;我已经尝试了大多数建议的方法,其中所有方法都没有将变量传递给调用位置范围,或者需要使用最后一个函数变量值保存的闭包,遗憾的是我无法控制其余的代码所以我无法修改函数最终被调用的位置。

这可能是一个临时解决方案;我知道函数的解析字符串是多么丑陋。就浏览器兼容性而言,这只会在一个环境中运行,所以我认为我们在那里非常安全。

无论如何,再次感谢您的回答和讨论。

5 个答案:

答案 0 :(得分:5)

如果你只想要一个简单地调用方法的函数数组,那就简单了:

for(var i=0; i<someNumber; i++) {
    someArray.push(someObject.someOtherFunctionCall.bind(someObject, i));
}

请注意,这需要Function.bind,这在旧版浏览器中可能无法使用。如果您需要支持旧版浏览器,可以shim it或使用此版本:

for(var i=0; i<someNumber; i++) {
    someArray.push(function(i) {
        return function() {
            return someObject.someOtherFunctionCall(i);
        };
    }(i));
}

编辑:这是旧答案,也应该有效,但不太优雅:

for (var i = 0; i < someNumber ; i++) {
    var foo = new Function("someObject", "return function() { someObject.someOtherFunctionCall(" + value + ") }")(someObject);
    someArray[i] = foo;
}

答案 1 :(得分:2)

尝试:

var foo = function() { someObject.someOtherFunctionCall(value ) };
someArray[i] = foo; 

如果foo不是全局变量,则可以执行此操作以传递值:

 var foo = (function(value) { return function() { someObject.someOtherFunctionCall(value ) } }) ( value );  

答案 2 :(得分:1)

您只能使用括号内的内部部分,并通过eval()函数调用它们。

以下是说明:http://www.w3schools.com/jsref/jsref_eval.asp

这是一个例子:

for (var i = 0; i < someNumber ; i++) {
    var foo = "someObject.someOtherFunctionCall(" + value + ");";
    someArray[i] = foo;
}

eval(someArray[0]);

答案 3 :(得分:1)

即使你开始工作,如果值没有消毒输入,也是相当不安全的。我只会使用匿名函数(无字符串),如下所示:

var foo = function() { someObject.someOtherFunctionCall(value) };

由于JS中的范围,value以后可以使用foo除非您在该行之后更改值,否则它将读取更改后的内容value

编辑:当我仔细查看这个问题时,我意识到这不起作用。请给我一些时间重新考虑我的答案。

更新:如果您真的想这样做,请考虑其他答案。

(JS神会哭,但是......)

答案 4 :(得分:1)

给它自己的范围,

for (var i = 0; i < someNumber ; i++) {
    someArray[i] = (function(idx){
        return function() { someObject.someOtherFunctionCall(idx); };
    })(i)        
}