【问题标题】:Converting a string into function in javascript在javascript中将字符串转换为函数
【发布时间】:2011-11-24 22:18:26
【问题描述】:

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

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

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

someArray[0]();

我需要将值添加到函数中,有什么想法吗?

编辑:我只是用“价值”代替了“我”为混乱道歉

更新:

好的,我接受了 icktoofay 的回答,因为它可以回答您的大部分问题和疑虑;我已经尝试了大多数建议的方法,所有这些方法要么没有将变量传递给调用位置范围,要么需要与最后一个函数变量值保持一致的闭包,不幸的是我无法控制其余的代码,所以我无法修改函数最终被调用的位置。

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

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

【问题讨论】:

  • 我真的很想知道您为什么要这样做,因为这似乎是个坏主意(tm)。
  • 我真的很好奇你为什么将函数定义为字符串?

标签: javascript string function casting


【解决方案1】:

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

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;
}

【讨论】:

    【解决方案2】:

    试试:

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

    如果 foo 不是全局变量,你可以这样做来传递值:

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

    【讨论】:

    • 我试过了,这个循环的问题是,闭包“值”将被设置为传递给它的值的最后一次迭代,使所有调用的值都为 99
    【解决方案3】:

    您只能使用括号之间的内部部分,并通过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]);
    

    【讨论】:

      【解决方案4】:

      即使你得到了这个工作,如果值没有经过净化输入,它也是相当不安全的。我只会使用匿名函数(无字符串),如下所示:

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

      由于 JS 中的作用域,value 稍后将可用于 foo除非您在该行之后更改值,否则它将读取更改后的 value

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

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

      (不过,JS 神会哭泣……)

      【讨论】:

        【解决方案5】:

        给它自己的范围,

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-04
          • 2022-01-23
          相关资源
          最近更新 更多