eval
eval
接受字符串参数,解析其中的js代码。如果编译失败,会抛出异常,否则执行其中的代码,计算返回值。
1 | eval('2+2'); // 4 |
在实际应用中,通常这样转换JSON。
1 | var jsonStr = '{ "age": 20, "name": "jack" }'; |
为什么要加括号呢?
因为js中{}通常是表示一个语句块,
eval
只会计算语句块内的值进行返回。加上括号就变成一个整体的表达式。
1 | console.log( eval('{}') ); // undefind |
使用eval
需要注意执行作用域
1 | var s = 1; |
在局部环境使用eval便会创建局部变量。可以显示指定eval
调用者来改变上下文环境。
1 | var s = 'global'; |
Function
在之前我对于Function
的了解只限于“定义方法的一种非主流方式”。却忽略了Function
与eval
相同的字符串参数特性。
语法:var func = new Function(arg1, arg2, ..., functionBody);
实例:
1 | var add = new Function('a', 'b', 'return a+b;'); |
由于其形参使用字符串的方式表示,也可以使用1个字符串来描述多个形参。
1 | var add = new Function('a, b', 'return a+b;'); |
在转换JSON的实际应用中,只需要这么做。
1 | var jsonStr = '{ "age": 20, "name": "jack" }', |
eval
与 Function
都有着动态编译js代码的作用,但是在实际的编程中并不推荐使用。如果可以,请用更好的方法替代。
在一些特殊的运用场合,也有一些合理运用的实践。比如模板解析等。