闭包是啥
MDN官方解释:闭包是函数和声明该函数的词法环境的组合。
在js中,函数内部可以读取到全局变量的值,但在函数外部无法读取函数内部的值1
2
3
4
5function f1(){
var n =100
}
console.log(n) //n is not defined
但在js中可以这样1
2
3
4
5
6
7
8
9
10function f1(){
var n =100
function f2(){
console.log(n);
}
return f2
}
var result = f1()
console.log(result()) // 100
在上面的代码段,函数f2可以读取到函数f1的变量n,这时把函数f2作为返回值,就可以在f1外部读取到变量n了。
简单地说,闭包是指有权访问其他函数作用域中的变量的函数。
再看一个例子↓1
2
3
4
5
6
7
8
9function add(a){
function wrapper(b){
return a+ b
}
return wrapper
}
temp = add(1)
console.log(temp(2)) // 3
上面的代码段中,变量a和b始终保持在内存中
「闭包」,是指拥有多个变量和绑定了这些变量的环境的
表达式(通常是一个函数),因而这些变量也是该表达式
的一部分。
闭包的用处
最大的用处当然是面试…(手动滑稽)
闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
所有的应用围绕在这两点展开
链式调用就是应用闭包的一个典型例子1
2
3
4
5
6
7
8
9var Obj = {
a: 1,
func: function(){
this.a += 1;
return this
}
}
Obj.func().func();
console.log(Obj.a); //3