1、什么是闭包?
如图所示,闭包就是一个定义在函数内部的函数,其作用是将函数内部和函数外部连接起来。 大家知道,作用域的问题,就是在函数内部定义的变量称为局部变量,外部取不到值。 下面我们通过代码来更加详细地看一下:
function A() { let x = 1; return function B() { console.log(x); x ; } } console.log(A()); //直接打印返回的B let b = A(); b(); //1 b(); //2 b(); //3
上述代码我们可以看到的是再次执行A函数的时候(其实这时候执行的是B),会打印出1,再次执行,会打印出2,再执行会打印出3。我们知道了闭包不仅可以拿到函数内部的变量,还可以保存内部的变量。
接下来,我们来看下闭包的使用场景,
for (var index = 0; index < 5; index ) { setTimeout(function () { console.log(index) }); }
上面的代码段,我们会打印5个5,为啥呢?因为当我们执行for循环时,setTimeout是异步的,所以每次等for循环加完,再执行setTimeout函数,一共执行5次。另一个原因因为使用了var声明的。循环体里的index跟外部的index是存在于同一个作用域,相当于在全局定义了一次。
下面我们来使用let来声明一下。结果就不一样。分别打印0、1、2、3、4,
代码语言:javascript复制for (let index = 0; index < 5; index ) {
setTimeout(function () {
console.log(index)
});
}
12345
最后,我们使用闭包也来实现一下,同样分别打印0、1、2、3、4,在外部函数每次传入实参时,也就是每次循环的值index,作用到形参i,因为setTimeout为内部函数,每次都会记录值,然后打印出来。
代码语言:javascript复制for (var index = 0; index < 5; index ) {
(function (i) {
setTimeout(function () {
console.log(i)
});
})(index);
}
1234567
另一个使用场景是柯里化。下面一个问题我们将详解。 2、什么是柯里化?
是把接受多个参数的函数变换成接受一个单一参数(最初的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
更多内容请见原文,原文转载自:https://blog.csdn.net/weixin_44519496/article/details/120020252