你不可不知的JS面试题(第三期)

本文深入探讨了闭包的概念,它允许内部函数访问并保存外部函数的变量。通过示例展示了闭包如何解决异步操作中作用域问题,并在for循环中产生预期输出。此外,还介绍了柯里化技术,将其定义为将多参数函数转化为单参数函数的过程,以创建可复用的分步构建函数。文中通过实例解释了柯里化的应用及其在函数式编程中的价值。
摘要由CSDN通过智能技术生成

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,

for (let index = 0; index < 5; index++) {
    setTimeout(function () {
        console.log(index)
    });
}

最后,我们使用闭包也来实现一下,同样分别打印0、1、2、3、4,在外部函数每次传入实参时,也就是每次循环的值index,作用到形参i,因为setTimeout为内部函数,每次都会记录值,然后打印出来。

for (var index = 0; index < 5; index++) {
    (function (i) {
        setTimeout(function () {
            console.log(i)
        });
    })(index);
}

另一个使用场景是柯里化。下面一个问题我们将详解。
2、什么是柯里化?

是把接受多个参数的函数变换成接受一个单一参数(最初的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

更多请见:http://www.mark-to-win.com/tutorial/50916.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值