闭包是啥

MDN官方解释:闭包是函数和声明该函数的词法环境的组合。

在js中,函数内部可以读取到全局变量的值,但在函数外部无法读取函数内部的值

1
2
3
4
5
function f1(){
var n =100
}

console.log(n) //n is not defined

但在js中可以这样

1
2
3
4
5
6
7
8
9
10
function 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
9
function 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
9
var Obj = {
a: 1,
func: function(){
this.a += 1;
return this
}
}
Obj.func().func();
console.log(Obj.a); //3