闭包是javascript中绕不开的话题,关于闭包的一些概念和应用,这方面资料比较多,在此就不再赘述。众所周知,闭包的一个作用就是 让一些变量始终保持在内存中 ,在此我用一些实际代码对这句话作进一步的理解。

demo1:function closure(){var n = 0;function test() {console.log(++n);}test() test() }closure(); //输出1,2(这个很好理解,不多说)
demo2:function test(){var i=0;return function(){console.log(i++);}}var fn = test();fn(); //输出0fn(); //输出1

上述代码中,fn就是执行函数test()返回的匿名函数。由于fn又是一个全局变量,生命周期一直存在,且这个匿名函数引用了父函数test里面的一个局部变量,所以变量i的状态会被一直保存.

demo3:function test(){var i=0;return function(){console.log(i++);}}test()(); //输出0test()(); //输出0

上述代码中,执行test()返回的是其内部的匿名函数,但是执行完test()()以后,该匿名函数的生命周期已经结束,所以变量i的状态没有得到保存。

最近在简书上读到一篇有趣的文章,其中一些代码如下:

for (var i = 0; i < 5; i++) {setTimeout((function(i) {console.log(i);})(i), i * 1000);
}   //输出0,1,2,3,4

上述代码中有一个setTimeout()函数,其使用格式为setTimeout(func,time),意思是至少过time时间后,执行func。有了这样的认识后,我们可以把func等价成:
(function(i){console.log(i)})(i)这个自执行函数。所以这个事情分两步,首先每次循环自执行函数肯定会立即执行一次,会依次输出1,2,3,4。其次,每过time时间,执行一次func,但是在上述代码中,func等价于一个立即执行函数,没有返回值,故什么也不会做。
如果把上述代码改成这样:

for (var i = 0; i < 5; i++) {var j=7;setTimeout((function(i) {console.log(i);return function(){console.info(j++);}})(i), i * 1000);
}

上述代码会依次输出0,1,2,3,4, 7,8,9,10,11(结合这个例子理解上一个问题,就容易多了)

如果把上面的代码改成这样呢?

for (var i = 0; i < 5; i++) {setTimeout(function() {console.log(i);}, i * 1000);
}

运行上面的代码会输出5个5(这一点现在可以理解了吧),有人不解的是为什么是每隔一秒输出5而不是隔五秒输出5。setTimeout(func,time)这个函数延迟执行的只是func里面的动作,而time的值是不存在延迟的。上面执行for循环,相当于:setTimeout(func,1000),setTimeout(func,2000) .... 第一次setTimeout执行的时候等了一秒(准确地说,至少要等一秒),第二次setTimeout执行的时候等2秒,但是前面第一次执行的setTimeout函数时,已经等了一秒,所以只需再等一秒就可以立即执行了。在这里,需要弄明白的是,setTimeout函数延迟执行的时间,起点是从time开始赋值的时候计算的,不是从上一个setTimeout函数执行完开始算的。

javascript中闭包的一些理解相关推荐

  1. [转]在Javascript中闭包(Closure)

    转载自: http://baike.baidu.com/view/648413.htm 一.什么是闭包? "官方"的解释是:所谓"闭包",指的是一个拥有许多变量 ...

  2. 浅谈JavaScript中闭包

    引言 闭包可以说是JavaScript中最有特色的一个地方,很好的理解闭包是更深层次的学习JavaScript的基础.这篇文章我们就来简单的谈下JavaScript下的闭包. 闭包是什么? 闭包是什么 ...

  3. 在Javascript中闭包(Closure)

    一.什么是闭包? "官方"的解释是:所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 相 ...

  4. Javascript中闭包的作用域链

    作用域定义了在当前上下文中能够被访问到的成员,在Javascript中分为全局作用域和函数作用域,通过函数嵌套可以实现嵌套作用域. 闭包一般发生在嵌套作用域中.闭包是JavaScript最强大的特性之 ...

  5. JavaScript中闭包实现的私有属性的getter()和setter()方法

    注意: 以下的输出都在浏览器的控制台中 <!DOCTYPE html> <html> <head><meta charset="utf-8" ...

  6. JavaScript中事件循环的理解 Event Loop

    为了解决单线程运行阻塞问题,JavaScript用到了计算机系统的一种运行机制,这种机制就叫做事件循环(Event Loop) 事件循环(Event Loop) 在JavaScript中,所有的任务都 ...

  7. 对于JavaScript中this关键字的理解

    这是我第二遍学this了,第一遍学的懵懵的.this指哪里都是凭我一个男人的直觉然后控制台输出看看对不对. 刚查了书.博客.视频.理解差不多了.毕竟菜鸡me: 一.首先介绍下什么是this this是 ...

  8. 谈谈我对Javascript中This对象的理解

    this 指针的隐式赋值 this总是指向调用该方法的对象: 在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this总是指向全局对象Window: 显示操纵 t ...

  9. javascript中闭包的真正作用

    参考阮一峰的文章:http://javascript.ruanyifeng.com/grammar/function.html#toc23 1. 读取函数内部变量,封装一些私有属性 function ...

最新文章

  1. 转: windows系统下mysql出现Error 1045(28000) Access Denied for user 'root'@'localhost'
  2. [UE4]网游中角色Pawn的移动位置同步以及RTS多角色同时移动的解决方案
  3. C#网页数据采集(一)HtmlAgilityPack
  4. GPU 编程入门到精通(三)之 第一个 GPU 程序
  5. JVM调优:常见垃圾回收算法
  6. MS SQL 不常用但却十分有用的一些语法
  7. 【设计思想解读开源框架】mysql官方文档中文版下载免费
  8. 安卓App报错:android.os.FileUriExposedException
  9. 内部类(innerclasses)
  10. bootstrapV4.6.0实现标签页(改造v3.3.7)- 代码篇
  11. linux网卡顺序问题,linux网卡绑定及网卡顺序变更测试.docx
  12. css如何将元素水平居中
  13. Spring MVC测试框架详解——服务端测试
  14. [Windwos Phone 8]多个按钮的共用事件
  15. cs1.6服务器修改游戏类型,如何自己架设CS1.6服务器?
  16. node-sass 安装失败问题 2022最新版
  17. CVPR2022Oral专题系列(一):低光增强
  18. 【工业互联网】工业互联网
  19. 计算机网络CPT简单应用
  20. Android商城开发----点击左侧分类列表右侧更新对应列表内容

热门文章

  1. SVN中提交时提示副本被锁定,执行清理时也提示副本被锁定的解决办法
  2. 关于纯cs3动画的五个原创实例分享
  3. 关于程序员之间丧心病狂的鄙视链——编程语言篇
  4. ES5规范之Object增强
  5. Silverlight+WCF 新手实例 象棋 主界面-事件区-求和认输(三十二)
  6. linux中shell条件判断if中的-a到-z的意思
  7. 那些德艺双馨的网站列表-updating
  8. MongoDB_限制集(Capped)
  9. Careercup | Chapter 4
  10. org.hibernate.hql.ast.QuerySyntaxException: ? is not mapped