题目
考察内容
闭包,函数柯里化
题目描述
- 写一个func函数,调用func(-, b, c)(a),按照顺序输出a,b,c
- 写一个func函数,调用func(-, b, c)(a)(),按照顺序输出a,b,c
代码
1 | // func(-, b, c)(a),按照顺序输出a,b,c |
1 | // 调用func(-, b, c)(a)(),按照顺序输出a,b,c |
函数柯里化
介绍
currying的概念最早是由俄国数学家发明,后由著名的数理逻辑家Haskell Curry将其丰富发展,curring由次得名。currying又称部分求值。一个currying接收到一批参数之后,并不直接求值,而是继续返回另一个函数,之前的参数通过闭包保存在内存中。直到最后一次调用的时候,返回所有参数的求值。
使用场景
使用场景,小A每天都要记录存款,add(100), add(120)…直到一个月最后一天的时候再去计算总存款数add()。不用每天都算一遍。
代码
小A 到最后arguments.length === 0的时候,才返回总的存款。之前都把每天花了多少钱记录在内存中。
1 | var add = (function() { |
下面思考下,如果把柯里化函数做到更通用,很容易想到可以把sum相加部分的代码单独抽离封装起来。
然后通过入参fn传入柯里化函数。
1 | var currying = function(fn) { |
闭包和函数柯里化到底有何关系
函数柯里化是积累参数,延迟到最后执行add操作;
函数柯里化也是通过闭包概念实现的,积累的参数可以保存在内存中。
练习巩固
题目一
- 题目1、add(1)(2)(3)(4); // 10
- 题目2、add(1)(2)(3)(4)(); //10
- 题目3、add(1,2)(3,4)(); //10
- 题目4、add(1,2)(3,4)(5,6).toString(); //10
闭包实现
1 | /** |
1 | /** |
1 |
|
1 |
|
函数柯里化实现
1 | /** |
1 | /** |
题目二
思考以下两块代码分别输出什么
1 | var name = "The Window"; |
1 | var name = "The Window"; |
题目三
思考以下代码输出什么:
1 | function buildList(list) { |
参考文档
阮一峰学习Javascript闭包(Closure)
理解javascript闭包
一道javascript面试题(闭包与函数柯里化)