-.- -.-
首页
  • 分类
  • 标签
  • 归档
  • Lodash 源码分析 (opens new window)
Mozilla (opens new window)
GitHub (opens new window)

江月何年初照人

首页
  • 分类
  • 标签
  • 归档
  • Lodash 源码分析 (opens new window)
Mozilla (opens new window)
GitHub (opens new window)
  • js有意思的问题

江月何年初照人
2021-03-31
随笔

js有意思的问题

# js有意思的问题

提示

实现这样一个函数,输出结果如下:

f(1) == 1
f(1)(2) == 5
f(1)(2)(3) == 14
1
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

优化一下是这样

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

这里实现,每次是先计算结果,然后返回函数,下面的方法是先保留数据,然后后计算结果,相比较而言下面的方式更合理,可以支持多个参数

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

充分利用了闭包还有 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

斐波那契数列这里也是这种思路,使用了解构赋值进行值的交换

编辑 (opens new window)
上次更新: 2021/03/31 17:56:34
最近更新
01
a标签下载限制
08-08
02
必应每日一图
05-27
03
小球碰壁反弹动画
05-26
更多文章>
Theme by Vdoing | Copyright © 2021-2023 Himawari | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式