记 js 的一个小坑

2016-09-23 13:28:44 +08:00
 zhy0216
5674 次点击
所在节点    JavaScript
41 条回复
FrankFang128
2016-09-23 17:22:06 +08:00
搞不懂 var ,最后去用 let 。
呵呵。
wangcansun
2016-09-23 17:22:27 +08:00
所以 es6 中使用 let 了
ianva
2016-09-23 17:30:39 +08:00
ES6 的实现:

[1,2,3].map( num=>()=>console.log(num) ).forEach(fn=>fn())

在大部分的情况下 map, filter, reduce, forEach 代替 for 要简单的多
ianva
2016-09-23 17:40:43 +08:00
再彻底一点:

[...Array(3).keys()].map( num=>()=>console.log(num) ).forEach(fn=>fn())
21grams
2016-09-23 17:50:12 +08:00
别再用 var 了,全部用 let
longear
2016-09-23 17:50:27 +08:00
@prefere 嘘。。。 无需更正,了解你了
fundon
2016-09-23 18:27:27 +08:00
安利下 「 ES6: 快速体验,及实用小贴士」 https://github.com/fundon/ES6-QuickStart-and-Tips
vwok
2016-09-23 18:35:08 +08:00
@prefere ![]( http://imgur.com/Ob8Y855) 看的讲闭包的都没讲到原型结构啊,今天终于知道 closure 是怎么来的了
sudoz
2016-09-23 18:36:39 +08:00
入队的时候没有执行 console.log 啊
hronro
2016-09-23 18:40:35 +08:00
楼上的各位说用 let 的,现在没人敢直接在生产环境下直接用 let 吧?都是要 babel 编译之后才能用的。如果只是一个小程序的话,上 babel 的成本又太高了
yhxx
2016-09-23 22:56:08 +08:00
因为 let 提供了块级作用域
magicdawn
2016-09-24 02:12:29 +08:00
mingyun
2016-09-24 08:26:43 +08:00
@magicdawn
@ianva 卧槽,看不懂

@fundon 先学习了
YuJianrong
2016-09-24 08:30:31 +08:00
@hronro 成本高在哪?编译出来大小增加不大啊。
如果用到一些增强的内置函数需要挂 polyfill ,但这个可以自己挑需要什么啊,即使全部挂上也没多大。
Bensendbs
2016-09-24 10:03:23 +08:00
用 let...var 有作用域提升的问题..
winiex
2016-09-24 10:31:13 +08:00
let 的作用于是我们常见意义上的块级作用于,而 var 的作用域则仅适用于 function ,一般意义上的 code block 对它没有作用域的限制意义。从编程语言的角度来看, var 声明的变量的作用域部分是不完整的。建议用 let 。

[“ let ” keyword vs “ var ” keyword in Javascript]( http://stackoverflow.com/questions/762011/let-keyword-vs-var-keyword-in-javascript)
zongren
2016-09-24 10:34:23 +08:00
用闭包也能解决吧
wizardforcel
2016-09-24 11:16:58 +08:00
@prefere 每个函数在调用时都会有一个帧,局部变量当然是存到帧里面。但是有的帧在函数返回时会销毁, lz 这种情况不会。因为函数中的函数会关联外层函数的帧,这个帧还有函数在用就没法销毁。
poke707
2016-09-24 16:30:22 +08:00
这个可以说是 Javascript 的坑也可以说是 feature 。虽然有意这样写的情况不多见吧。
重要的是要理解编程语言本身,变量的值和引用啊,作用域啊,语法和表达式啊。
如果不重视基本功, ES6 照样会踩坑。

比如 [1,2,3].map(n => {value: n}) 有人觉得会返回他以为的东西,有人觉得会报错(比如我,我都忘了有 label 这回事)。
但结果是不但不报错还会返回 [undefined, undefined, undefined] 呢。
neone
2016-09-24 18:58:10 +08:00
JS 的经典问题。
`var` 声明是没有块级作用域的,所以上面的代码等于:
```
var i;

for (i = 0; i < 3; i++) {
funcList.push(function() {
console.log(i);
});
}

```
ES5 中可以使用闭包解决, ES6 中直接使用`let`即可。
`let`声明的变量具有块级作用域,所以 3 次循环会产生 3 个不相同(仅同名)的变量`i`,添加入数组中的函数引用的是不同的变量。事实上你在循环的外部先用`let`定义变量`i`,那么结果也都是 3 3 3 ,如下:
```
let funcList = [];

let i;
for (i = 0; i < 3; i++) {
funcList.push(() => {
console.log(i);
});
}

for (let j = 0; j < 3; j++) {
funcList[j]();
}

```

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

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

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

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

© 2021 V2EX