js有意思的问题
# js有意思的问题
提示
实现这样一个函数,输出结果如下:
f(1) == 1
f(1)(2) == 5
f(1)(2)(3) == 14
1
2
3
2
3
一开始想到的是这样
function f(a) {
a = +a || 0
let value = a * a
function temp (b) {
b = +b || 0
value += b * b
temp.value = value
return temp
}
temp.value = value
return temp
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
优化一下是这样
function f(a) {
let value = 0
function temp (b) {
value += b ** 2 || 0
temp.value = value
return temp
}
return temp(a)
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
这里实现,每次是先计算结果,然后返回函数,下面的方法是先保留数据,然后后计算结果,相比较而言下面的方式更合理,可以支持多个参数
function f(...parentArgs) {
const result = [...parentArgs]
function temp (...args) {
result.push(...args)
return temp
}
Object.defineProperty(temp, 'value', {
get: () => result.reduce((res, item) => (res += item ** 2 || 0 , res), 0)
})
return temp
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
充分利用了闭包还有 getter
的概念,和它类似的还有实现斐波那契数列
function fib() {
let a = 1;
let b = 1;
function temp () {
[a, b] = [b, a + b]
temp.value = a
return temp
}
temp.value = a
return temp
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
斐波那契数列这里也是这种思路,使用了解构赋值进行值的交换
编辑 (opens new window)
上次更新: 2021/03/31 17:56:34