Littlest things

一道关于JavaScript柯里化的面试题

题目

1
2
3
编写一个函数
console.log(mul(1)(2)(3)) //6
console.log(mul(2)(3)(4)) //24

解法

优解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// es6
const mul = (x) => {
let sum = x
let curried = (y) => {
sum = sum * y
return curried
}
curried.toString = () => sum
return curried
}
console.log(mul(1)) //1
console.log(mul(1)(2))//2
console.log(mul(1)(2)(3))//6
console.log(mul(1)(2)(3)(4))//24
...
// es5
function mul(x){
var sum = x
var curried = function(y){
sum = sum * y
return curried
}
curried.toString=function(){
return sum
}
return curried
}
console.log(mul(1)) //1
console.log(mul(1)(2))//2
console.log(mul(1)(2)(3))//6
console.log(mul(1)(2)(3)(4))//24
...

这种解法主要用的是闭包,然后将函数作为返回值,然后重写curried的toString

最简单的解法

1
2
3
4
5
6
7
8
9
10
11
12
13
//es6
const mul = (x) =>(y) =>(z) => x*y*z
console.log(mul(1)(2)(3))
//es5
function mul(x){
return function(y){
return function(z){
return x*y*z
}
}
}
console.log(mul(1)(2)(3))

这种解法就是完全,就是使用柯里化了