[英]Converting a string into function in javascript
我已经做了一些谷歌搜索,但这个特殊的问题有点类似于“我如何评估字符串中的函数名称”所以我找不到解决方案,我想将字符串转换为函数所以说我有类似的东西:
for (var i = 0; i < someNumber ; i++) {
var foo = "function() { someObject.someOtherFunctionCall(" + i + ") }";
someArray[i] = foo;
}
我怎么会强迫foo所以我可以打电话
someArray[0]();
我需要把功能,任何想法烘焙的价值?
编辑:我只是为“混乱”代替“我”道歉
更新:
好的,我接受了icktoofay的回答,因为它有效,回答了你的大部分问题和疑虑; 我已经尝试了大多数建议的方法,其中所有方法都没有将变量传递给调用位置范围,或者需要使用最后一个函数变量值保存的闭包,遗憾的是我无法控制其余的代码所以我无法修改函数最终被调用的位置。
这可能是一个临时解决方案; 我知道函数的解析字符串是多么丑陋。 就浏览器兼容性而言,这只会在一个环境中运行,所以我认为我们在那里非常安全。
无论如何,再次感谢您的回答和讨论。
如果你只想要一个简单地调用方法的函数数组,那就简单多了:
for(var i=0; i<someNumber; i++) {
someArray.push(someObject.someOtherFunctionCall.bind(someObject, i));
}
请注意,这需要Function.bind
,这可能在旧版浏览器中不可用。 如果您需要支持旧版浏览器,可以使用以下版本进行填充或使用此版本:
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;
}
尝试:
var foo = function() { someObject.someOtherFunctionCall(value ) };
someArray[i] = foo;
要么
如果foo不是全局变量,则可以执行此操作以传递值:
var foo = (function(value) { return function() { someObject.someOtherFunctionCall(value ) } }) ( value );
你可以只使用括号之间的内部部分,并通过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]);
即使你能够正常工作,如果价值不是消毒输入,那也是相当不安全的。 我会使用匿名函数(没有字符串),像这样:
var foo = function() { someObject.someOtherFunctionCall(value) };
由于JS中的范围, foo
稍后可以使用value
, 除非您在该行之后更改值 , 否则它将读取更改的value
。
编辑:当我仔细研究这个问题时,我意识到这不起作用。 请给我一些时间重新考虑我的答案。
更新:如果你真的想这样做,请考虑其他答案。
(JS神会哭,但......)
只要赋予它自己的范围,
for (var i = 0; i < someNumber ; i++) {
someArray[i] = (function(idx){
return function() { someObject.someOtherFunctionCall(idx); };
})(i)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.