假设我有一个类似下面的Javascript字符串
var fnStr = "function(){blah1;blah2;blah3; }" ;
Run Code Online (Sandbox Code Playgroud)
(这可能来自用户输入的表达式,正确消毒,或者可能是某些符号计算的结果.这无关紧要).
我想定义fn好像我的代码中有以下行:
var fn = function(){blah1;blah2;blah3; } ;
Run Code Online (Sandbox Code Playgroud)
我怎么做?
我提出的最好的是以下内容:
var fn = eval("var f = function(){ return "+fnStr+";}; f() ;") ;
Run Code Online (Sandbox Code Playgroud)
这似乎是诀窍,即使它使用了可怕的eval(),并使用了一个稍微复杂的论点.我可以做得更好吗?即要么不使用eval(),要么提供更简单的参数?
依赖于Function.prototype.toString返回将解析为有效javascript函数的字符串(对于用户定义的函数)是否安全?
是否有任何常用的javascript引擎偏离规范,就如何以字符串形式表示函数对象?
我已经看到了这个问题,但我不确定它是否也在问同样的问题.我不在乎所有实现中的格式是否完全相同或者其他什么,我更担心一些缩小的js引擎只是剥离整个函数体...
我的sort()函数存在瓶颈,例如:
list.sort(function (a,b) {return (a.value - b.value);});
Run Code Online (Sandbox Code Playgroud)
冻结浏览器几秒钟.
对于循环的相同情况,建议使用"超时"策略,例如此处描述的策略:
那么,问题是,这可以用排序方法实现吗?
*在评论讨论后编辑
// main_div is a div defined before
for (let i=0; i<list.length; i++) {
main_div.appendChild(document.getElementById(list[i].id));
}
Run Code Online (Sandbox Code Playgroud)