为什么 eval for 循环会有返回值

2017-07-11 17:38:09 +08:00
 mufeng

2199 次点击
所在节点    JavaScript
8 条回复
timwei
2017-07-11 17:50:51 +08:00
push method returns object's length
timwei
2017-07-11 17:51:49 +08:00
mufeng
2017-07-11 17:53:42 +08:00
@timwei #1 谢谢
autoxbc
2017-07-11 18:28:40 +08:00
就这个题目来说,单看 push 的返回值并不算完。关键的部分是,ECMA 详细规定了块语句的返回值,for 循环的返回值,可以看这个文档。

http://www.ecma-international.org/ecma-262/6.0/index.html#sec-for-statement
timwei
2017-07-12 12:32:13 +08:00
@autoxbc 感谢回复,不过我认为与文件的 for 实现无关


TL; DR
```
value = eval('for(let a=0 ; a<9 ; a++){arr=[];arr.push(""); };'); //lz 的题目
value
// 1
//这个 1 是因为 eval() 返回了 for 最后的执行语句 arr.push("")
//而 arr.push("")返回了阵列的长度。
```

与文件中的 for 规定的返回值无关,倒是与执行顺序有关。
http://www.ecma-international.org/ecma-262/6.0/index.html#sec-forbodyevaluation

for 不帶 Return value 的
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for

举例来说,就是你"不能"写些像

```
value = for(let a=0 ; a<1 ; a++){ a };

```

会有输出是因为 eval(),eval()会 return 最后一个执行的 statement
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

```
eval(1; 2; 3;)
// 3

value = eval('for(let a=0 ; a<9 ; a++){arr=[];arr.push(""); }; 5566;');
// 5566
// #其实 for 跟 push 都是伪命题
```
mufeng
2017-07-12 12:33:55 +08:00
@timwei 是的,作用块的返回值
autoxbc
2017-07-12 21:15:14 +08:00
@timwei 在规范中似乎每种类型的语句都有一个明确的返回结果,不过从不能赋值存储看确实不是我说的返回值。

能看到输出结果的关键确实是 eval,或者说是 REPL。
mufeng
2017-07-13 09:01:25 +08:00
@autoxbc #7
@timwei #5
https://twitter.com/paul_irish/status/818568243350630401 有关于 statement completion value 的讨论

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/374569

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX