Javascript:使用eval()动态加载函数

时间:2017-08-30 11:33:16

标签: javascript eval

我想动态加载多个函数:

var str = "function foo() {} function bar() {}";
var functions = eval(???);
functions.foo();

这可以用eval完成吗?我只用一个功能才成功。

4 个答案:

答案 0 :(得分:1)

使用eval。 Not recommended

var str = "function foo() { console.log('foo'); } function bar() { console.log('bar'); }";
eval(str);
foo();

您可以使用对象并将函数放入其中。您可以稍后添加具有赋值的函数。

var functions = {
        foo: function () { console.log('foo'); },
        bar: function () { console.log('bar'); }
    };

functions.foo();

functions.baz = function () { console.log('baz'); }

functions.baz();

答案 1 :(得分:0)

使用functions.foo();,您尝试访问对象foo的属性functions,这将为您提供undefined

解决方案

您可以使用

之类的对象简单地替换函数字符串
var functions = {
   foo: function() {},
   bar: function() {}
}

这也避免了eval()的使用 现在,您可以使用functions.<functionName>;访问每个媒体资源。您可以在JavaScript中动态地添加属性。因此,您的问题中eval没有用例

实施例

&#13;
&#13;
var functions = {
   foo: function() { console.log('foo') },
   bar: function() { console.log('bar') }
}

function addNewFunction(object, functionName, functionImplementation) {
  object[functionName] = functionImplementation
}

addNewFunction(functions, 'ok', function() { console.log('ok') })

functions.foo()
functions.ok()
&#13;
&#13;
&#13;

答案 2 :(得分:0)

eval将执行某些字符串,但不会返回任何内容。因此functions将为undefined

eval也将在当前范围内运行给定的字符串。因此,解析的函数不一定会在全局范围内创建。

<强>示例:

&#13;
&#13;
var str = "function foo1() {console.log('foo1')} function bar1() {console.log('bar1')}";
var functions = eval(str);
console.log(functions);
foo1();

(function() {
  var str = "function foo2() {console.log('foo2')} function bar2() {console.log('bar2')}";
  var functions = eval(str);
  foo2();
})()
try {
  foo2();
} catch (ex) {
  console.log(ex.message)
}
&#13;
&#13;
&#13;

我的建议是,创建一个新的JS文件并动态加载它。

参考链接:

答案 3 :(得分:0)

var foo =&#39;(function foo(){})&#39;

var bar =&#39;(功能栏(){})&#39;

使用变量声明函数,然后使用eval

var result = eval(foo)

结果变量获取foo()函数的结果