JS闭包学习笔记(1):什么是闭包
来源:互联网 发布:上海mao livehouse知乎 编辑:程序博客网 时间:2024/05/18 00:51
闭包:当一个函数在其被声明的作用域环境外被执行时,它可以记住和使用它原本作用域中的变量。
function foo(){ var a = 2; function bar(){ console.log(a); } return bar;}var baz = foo();baz(); //2
bar函数可以使用foo函数内的变量。而当最后baz函数执行时,其实是bar函数执行,bar函数很显然地在其被声明的作用域外被调用,但是最后还是输出了2.
一般可能会觉得在foo函数执行完毕后,其内部作用域会消失(根据js垃圾回收机制)。但是由于闭包的存在,foo的内部作用域还一直存在在那里,bar函数仍然对此作用域有引用,而这个引用就是闭包。
因此当baz执行时(其实是bar执行),它依旧能使用它被声明时的作用域环境,因此就能使用变量a。
类似的,还有很多种将函数作为参数来传递的情况,这时函数就有可能在其他位置被执行。如:
function foo(){ var a = 2; function baz(){ console.log(a); } bar(baz);}function bar(fn){ fn(); //实际调用的是foo的内部函数,为闭包}
var fn;function foo(){ var a = 2; function baz(){ console.log(a); } fn = baz; //把baz传递给了一个全局变量}function bar(){ fn(); //实际调用的是foo的内部函数,为闭包}foo();bar(); //2
不管通过什么方式将内部函数传递到外部,它都会维持对其最初被声明时的作用域环境的引用,而且不管在何处调用此函数,闭包都会被执行。
看一个例子:
function wait(message){ setTimeout(function timer(){ console.log(message); },1000);}wait("hello closure");
内部函数timer做为setTimeout的参数,内部函数的词法作用域包含外部wait函数的作用域,因此timer会一直保持一个对变量message的引用。
执行wait函数,当1000毫秒过去时,异步的内部函数timer利用闭包可以继续使用变量message。
0 0
- JS闭包学习笔记(1):什么是闭包
- 什么是JS闭包
- 什么是js闭包
- JS闭包学习笔记
- js学习笔记-闭包
- js学习笔记(闭包)
- JS学习笔记(9)闭包
- js 中什么是闭包
- js--dom--什么是闭包
- JS闭包笔记
- Js笔记:闭包
- JS 学习笔记--理解闭包
- 【js学习笔记-048】-- 闭包
- js学习笔记之闭包
- js学习笔记_闭包
- js学习笔记之闭包
- Js闭包 学习
- js闭包学习
- 骨牌铺方格
- QQ能上,浏览器不能上网原因
- java 大数据方向面试题
- C# 对路径不允许访问
- Dubbo的服务治理
- JS闭包学习笔记(1):什么是闭包
- app\build\intermediates\res\merged\debug\values-v23\values-v23.xml 编译出错的问题
- kafka connect rebalance时herder大概率异常
- 磁盘性能指标——IOPS理论
- Linux中的文件描述符与打开文件之间的关系
- Nginx源码分析—HTTP框架执行流程
- RuntimeException与CheckedException差异
- PHP中使用foreach和引用导致程序BUG及解决办法
- SQL CONCAT函数