您的位置:首页 > Web前端 > JavaScript

JavaScript中的闭包

2019-06-18 11:54 102 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_41665697/article/details/92653685

1.什么是闭包?

一个函数嵌套另一个函数,内部函数引用了外部函数的变量,并且当外部函数调用的时候就形成了闭包。

[code]function fn (){
var a = 1;
function fn1(){
console.log(a)
}
return fn1;
}
var f = fn();
f()

//或者

function fn () {
var a = 1;
return function(){
console.log(a)
}
}
var f = fn();
f()

//或者

function show (msg,time) {
setTimeout(function(){
console.log(msg)
},time)
}
show("closure",2000)

我们可以使用谷歌的调试工具,debug查看一下

2.闭包的作用

(1)使函数内部的变量在函数执行完后没有消失,仍然存活在内存中,延长了局部变量的生命周期。在一个正常的函数内部,声明一个变量,当这个函数执行完之后,内部的变量就会消失。

(2)让函数外部可以操作(读写)到函数内部的数据(变量、函数)

3.闭包的生命周期

[code]function fn(){
var a = 1;
function fn2(){
a++;
console.log(a)
}
return fn2
}
var f = fn()
f();
f();
f = null;

在上面a++的这个例子当中,闭包是在fn2定义的时候就形成(不是在调用fn2)

那闭包在什么时候死亡呢,当变量f赋值为null的时候,切断了f指向内存中的联系,也就是地址值,成为了垃圾对象。

4.闭包的应用 

定义js模块

具有特定功能的js文件

数据和功能都封装在一个函数内部(私有的)

向外暴露一个对象或者函数,然后可以在外部调用

 

[code]//第一种方式

(function(window){
var msg ="i am msg"
function doUp(){
console.log("doUp "+msg.toUpperCase())
}
function doLower(){
console.log("doLower " +msg.toLowerCase())
}
//暴露方法
window.module={
doUp:doUp,
doLower:doLower
}
})(window)

//调用函数内部的方法
module.doUp()              // doUp I AM MSG

module.doLower()           // doLower i am msg

//第二种方式

function module (){
var msg ="i am msg"
function doUp(){
console.log("doUp "+msg.toUpperCase())
}
function doLower(){
console.log("doLower " +msg.toLowerCase())
}

return {
doUp:doUp,
doLower:doLower
}
}

var f =  module()
f.doUp()
f.doLower()

组成部分:

1.自调用的匿名函数

2.内部有数据  方法   还有向外暴露的对象

3.通过对象来调用

4.为什么自调用的匿名函数要传window这参数呢,不传window程序也是可以运行的,传了window是为了代码压缩。

5.推荐第一种方式

 

这篇写的能明白吗?哪里不明白,留言看到修改。。。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: