【问题标题】:eval(...) won't work on objects that contain functionseval(...) 不适用于包含函数的对象
【发布时间】:2014-05-30 08:28:54
【问题描述】:

evaling 用函数声明数组的字符串可以正常工作。但是,evaling 用函数声明对象的字符串不起作用。谁能告诉我为什么?

This JSFiddle 和下面的代码演示了这个问题:

"use strict";

// functions in arrays are ok:
var x = "[ function() {}, [function() {}] ]";
var o = eval(x);
console.log(o[1]);

// functions in objects are not ok (for some reason):
var y = "{a: function() {}, b: [function() {}] }";
var o = eval(y);
console.log(o['a']);

只有第二个eval 会引起麻烦。

在 Chrome 中,我得到:

未捕获的 SyntaxError:在严格模式代码中,函数只能在顶层或立即在另一个函数中声明。

在 IE 11 中,我得到:

预期标识符

【问题讨论】:

标签: javascript eval strict


【解决方案1】:

问题不在于你认为的地方。

改变

var y = "{a: function() {}, b: [function() {}] }";

var y = "({a: function() {}, b: [function() {}] })";

或者把eval的电话改成

var o = eval('('+y+')');

避免eval 认为您传递的是块而不是对象。

【讨论】:

  • 那么,如果我想eval 一个右值而不是代码,我应该将它包装在“()”中吗?这样做有什么坏处吗?
  • @Domi 它与“右值”无关,只是关于解析 - 在两种情况下都是“代码”。当 not 在 Expression 上下文中时,{..}not 被视为对象文字,而是被视为块语句。括号是确保表达式上下文的最简单(并且可能是最容易理解/一致)的方法,但不是唯一的方法。
  • @user2864740 你有这方面的链接或更多信息吗?我会对替代方案以及不同“evaling 策略”的优缺点感兴趣。仅供参考:rvalue 是某种表达方式,我在这里使用的表达方式。
  • @Domi 我在帖子中添加了一些相关问题(参见"Why the .. bracket..")。 ES5 grammar rules 包含信息,但需要阅读。
猜你喜欢
  • 2020-08-18
  • 2016-04-02
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多