什么是闭包
闭包从字面上的含义来讲,就是一个封闭的容器
就是说📦外看不到📦里面的东西
举个🌰
function a () {
var x = 1
console.log(x)
function b () {
var y = 2
console.log(y)
function c () {
var z = 3
console.log(z)
}
return c
}
return b
}
// 现在假如有三个📦,分别是a、b、c
// a 包含了b,b包含了c
// 这时候a访问不到b,a也访问不到c,b同样也访问不到c
//
我个人理解的话,内部的b和c两个包,都叫做 闭包
为什么要使用闭包
现在我们知道了什么是闭包了,每个东西我们去学它,肯定得知道它是用来干嘛的
1.隐藏私有变量,防止污染全局变量
2.可以读取内部环境(b包或c包)的变量的值,可以通过return返回包
3.可以让变量存储在内存中,不被刷新
举个🌰
function a () {
var x = 1
var y = 2
y = 3
console.log(y)
function b () {
y = 4
console.log(y)
}
return b
}
// 如果我把变量都定义在a环境中,这时a可以修改这个变量的值,会造成一些问题
使用场景
场景1 setTimeout(摘自qq_33183637)
for(var i=0; i<5; i++){
setTimeout(function(){
console.log(i)
}, 5000)
}
// 打印5,5,5,5,5
// 使用闭包
for(var i=0; i<5; i++){
// console.log(i) // 这时候会报错不知道为啥提示console.log不是一个函数
(function(num){
setTimeout(function(){
console.log(num)
}, 5000)
})(i)
}
// 打印0,1,2,3,4
场景2 传一个参数
function add(x) {
return function (y) {
return x + y
}
}
add(1)(2) // 3
add(4)(5) // 9
场景3 缓存(摘自https://www.cnblogs.com/fanfan-90/p/11921722.html)
function createFab(n) {
var _cache = {};
return function (n) {
var result = 0;
if (_cache[n]) {
return _cache[n];
}
if (n === 1 || n === 2) {
result = 1;
}
else {
result = fab(n - 1) + fab(n - 2);
}
_cache[n] = result;
return result;
}
}
var fab = createFab();
console.info(fab(6));
console.info(fab(6));
闭包内this指向问题
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
console.log(this.name); // 直接在对象方法里this 指向 Object
return function(){
return this.name; // 为什么是Window呢,因为这里有一个闭包匿名函数,闭包匿名函数通常指向全局
};
}
};
alert(object.getNameFunc()());//result:The Window
//
// 版权声明:本文为CSDN博主「ruanhongbiao」的原创文章,遵循 CC 4.0 BY-SA
// 版权协议,转载请附上原文出处链接及本声明。
// 原文链接:https://blog.csdn.net/qappleh/java/article/details/80311443