javascrip 怎么执行字符串里面的函数

昨天突然想到,js里面,这种情况

var aa='console.log(123)';

代码就是上面这样,有什么方法可以让字符串里面的函数执行?推荐使用什么方法?

阅读 8.7k
7 个回答

首先回答楼主,使用Function构造会比直接使用eval好一些:

var str = 'console.log(123)';
var fn = Function(str);
fn();

eval这个关键字不建议使用,个中原因在秘密花园也有解释
http://bonsaiden.github.io/Ja...

不过花园中只一再提到不要使用eval,并且给了以下示范:

var foo = 1;
function test() {
    var foo = 2;
    eval('foo = 3');
    return foo;
}
test(); // 3
foo; // 1

但却没有给出解决方案,我个人推荐做法,就是通过构造函数为‘期望执行的代码’创建新的函数作用域,尽可能减少对当前作用域的影响/污染

var foo = 1;
function test() {
    var foo = 2;
    (Function('foo = 3'))();//
    return foo;
}
test(); // 2
foo; // 1

有其他解决方案也可以继续交流

var aa='console.log(123)';
eval(aa)
var aa='console.log(123)';
eval(aa);

试了下 Function构造的方法,在 严格模式 下,并没有生效

那么除了eval()之外,还有别的方法么?

都说不太建议使用eval(),有什么具体不好的地方的么?

求教!

eval 建议不要这样

不建议使用eval()的原因无非两点:
1.性能不佳
2.安全性

没有做过测试,eval()对性能的影响到底有多大,但是我相信题主不至于到处都使用eval(),而且对于现代浏览器而言,个人觉得性能的影响并不会很大。

最重要的一点是安全性,大家都知道,如果能执行字符串里的代码,那么凡是有输入的地方,那都有可能发生XSS攻击等。

不知道题主为什么一定要执行字符串里的代码,但是只要能做好安全防范,而且不是大量使用eval(),那就放心的用吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题