From 7c27e393e0782fcf517dfb0b2812fbd9df51efe6 Mon Sep 17 00:00:00 2001 From: alsotang Date: Wed, 12 Nov 2014 17:38:58 +0800 Subject: [PATCH] void 0 --- lesson11/README.md | 26 ++++++++++++++++++++++++++ lesson14/README.md | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lesson11/README.md b/lesson11/README.md index 22d7cc5..9375a9f 100644 --- a/lesson11/README.md +++ b/lesson11/README.md @@ -105,6 +105,32 @@ console.log(add20(5)); 我暂时想不出什么实用的例子来,如果想深入理解这块,可以看看这篇 http://coolshell.cn/articles/6731.html +#### 闭包的一个坑 + +```js +for (var i = 0; i < 5; i++) { + setTimeout(function () { + console.log(i); + }, 5); +} +``` + +上面这个代码块会打印五个 `5` 出来,而我们预想的结果是打印 1 2 3 4 5。 + +之所以会这样,是因为 setTimeout 中的 i 是对外层 i 的引用。当 setTimeout 的代码被解释的时候,运行时只是记录了 i 的引用,而不是值。而当 setTimeout 被触发时,五个 setTimeout 中的 i 同时被取值,由于它们都指向了外层的同一个 i,而那个 i 的值在迭代完成时为 5,所以打印了五次 `5`。 + +为了得到我们预想的结果,我们可以把 i 赋值成一个局部的变量,从而摆脱外层迭代的影响。 + +```js +for (var i = 0; i < 5; i++) { + (function (idx) { + setTimeout(function () { + console.log(idx); + }, 5); + })(i); +} +``` + ### this 在函数执行时,this 总是指向调用该函数的对象。要判断 this 的指向,其实就是判断 this 所在的函数属于谁。 diff --git a/lesson14/README.md b/lesson14/README.md index ecc460a..50f7243 100644 --- a/lesson14/README.md +++ b/lesson14/README.md @@ -13,7 +13,7 @@ http://book.douban.com/subject/3590768/ js 这门语言,水很浅。没有太复杂的地方可以钻,但特么的坑又多。 -上面的那本书是一定要看的。 +上面的那本书是一定要看的。这本书专注在讲 js 语法,其他 js 的书都过多地涉及了浏览器知识。 ### JavaScript 之美