js闭包的前世今生详解
闭包
闭包是javascript的一个难点,也是特色。理解闭包,首先要了解javascript的全局变量和局部变量。在js的函数中,函数的内部是可以直接访问全局变量,但是函数的外部无法访问函数内部的局部变量。
如何从外部读取函数内部的局部变量?
我们需要函数内部的局部变量,正常情况下,这是办不到的。但是可以通过在函数的内部再定义一个函数
functiuon f1(){
var a = 1;
function f2(){
console.log(a) // => 1
}
}
闭包的概念?
上面代码中的f2函数,就是闭包。个人认为闭包就是就是能够读取到其他函数内部变量的函数
在javascript中,只有函数内部的子函数才能读取到局部变量,所以闭包也可以简单的理解成:‘定义在一个函数内部的函数’。所以本质上闭包是将函数内部和函数外部链接起来的桥梁。
闭包的用途?
闭包可以用在很多地方,它的最大用途有两个,一个是前面写到的可以读取到函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会因为f1函数被调用后自动清除。
如何让变始终保持在内存中?
上面的例子 f1函数时f2函数的父函数,而f2被赋值给了一个全局变量,这导致f2始终在内存中,而f2的存在关系依赖于f1,因此f1也始终在内存中。不会再调用结束后,被垃圾回收机制回收。
常见的闭包写法
- 在构造函数中
function number1(){
var n = 0;
this.add = function(){
n++;
console.log(n)
}
}
var num1 = new number1();
num1.add