相关疑难解决方法(0)

eval()和新的Function()是一样的吗?

这两个功能在幕后做同样的事情吗?(在单一陈述函数中)

var evaluate = function(string) {
    return eval('(' + string + ')');
}

var func = function(string) {
    return (new Function( 'return (' + string + ')' )());
}

console.log(evaluate('2 + 1'));
console.log(func('2 + 1'));
Run Code Online (Sandbox Code Playgroud)

javascript optimization eval function

86
推荐指数
3
解决办法
4万
查看次数

Function构造函数的合法使用

正如反复提到的,使用Function构造函数被认为是不好的做法(另见ECMAScript语言规范, 5 版,第15.3.2.1节):

new Function ([arg1[, arg2[, … argN]],] functionBody)
Run Code Online (Sandbox Code Playgroud)

(其中所有参数都是包含参数名称的字符串,最后一个(或唯一)字符串包含函数体).

要概括,它被认为是缓慢的,因为通过解释歌剧院团队:

每次Function 在表示源代码的字符串上调用构造函数时,脚本引擎必须启动将源代码转换为可执行代码的机制.这通常对性能来说很昂贵 - 例如,比简单的函数调用要贵一百倍.(Mark'Tarquin'Wilton-Jones)

虽然它并没有那么糟糕,但根据这篇关于MDC的帖子(我没有使用当前版本的Firefox自己测试).

克罗克福德补充

引用该语言的惯例使得将函数体正确表达为字符串变得非常困难.在字符串形式中,无法进行早期错误检查.[...]它浪费了内存,因为每个函数都需要自己独立的实现.

另一个不同之处在于

由Function构造函数定义的函数不会继承除全局范围(所有函数都继承)之外的任何范围.(MDC)

除此之外,在创建new Function使用动态内容时,您必须注意避免注入恶意代码.

也就是说,TJ Crowder在回答中

除了一些高级边缘情况之外,这里几乎从不需要类似的新函数(...).

所以,现在我想知道:这些"先进边缘案例"是什么?Function构造函数是否合法使用?

javascript function-constructor

40
推荐指数
4
解决办法
6297
查看次数

在JS中动态创建函数

我正在为JS游戏创建AI引擎,它由有限状态机构成.我正在从XML加载状态数和它们的变量值.我也想加载行为,因为我没有时间创建脚本语言,我认为将JS代码"插入"外部文件(在XML节点内)并在上面执行它是个好主意.需求.

这样的事情

<evilguy1>
    <behaviour>
        this.x++;
    </behaviour>
    <behaviour>
        this.y++;
    </behaviour>
</evilguy1>
Run Code Online (Sandbox Code Playgroud)

对于这样的事情:

function behaviour_1(){
    this.x++;
}
function behaviour_2(){
    this.y++;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,现在我已经加载了代码,我该如何执行它?我想为每个代码'node'创建一个具有唯一名称的函数,然后从游戏逻辑中调用它们,但我不知道这是否可行(因为你可以从HTML加载更多的JS代码,你也应该能够从JS代码中做到这一点,没有?).如果没有,有没有类似的解决方案?提前致谢!

(PS:外部库依赖性越小越好)

编辑1:

好的,现在我知道如何创建包含代码的函数

window[classname] = function() { ... };
Run Code Online (Sandbox Code Playgroud)

javascript

27
推荐指数
3
解决办法
5万
查看次数

Javascript:添加动态方法的更好方法?

我想知道是否有更好的方法将动态方法添加到现有对象.基本上,我试图动态组装新方法,然后将它们附加到现有函数.

这个演示代码有效.

builder = function(fn, methods){

    //method builder
    for(p in methods){
        method = 'fn.' + p + '=' + methods[p];
        eval(method);
    }

    return fn;
}
test = {}
test = builder(test, {'one':'function(){ alert("one"); }','two':'function(){ alert("two"); }'} );

test.one();
test.two();
Run Code Online (Sandbox Code Playgroud)

javascript methods dynamic

4
推荐指数
3
解决办法
3万
查看次数