JS笔试题:实现一个sum函数

380 阅读1分钟

题目:

// JS笔试 实现一个sum函数
// sum 可以无限加数字
// sum(1)(1)(2)...(n)
function sum(n) {
	// TODO
}

console.log(sum(1).result) // 1
console.log(sum(1)(2).result) // 3
console.log(sum(1)(2)(3).result) // 6
console.log(sum(4)(5)(6)(7).result) // 22

这道题纠结的地方在于解决两个问题,一是如何保存sum的计算结果,二是怎么使sum的返回值既可以当做函数来调用又可以当做对象来读取result属性。两个问题可以一并处理。

首先我们刚学Javascript的时候教程上就讲过,万物皆对象,函数也是一种对象,函数也有原型链和属性。我们可以用console.dir打印一个匿名空函数看看:

image.png

由上可以看出来,匿名函数是一个name属性为空字符串的对象,它的原型链最终都是指向Object()。
那么知道这个之后我们就要想如何能往函数上面加自定义属性?用this吗?
这里又涉及到this指向的问题了,普通函数的this是谁调用指向谁,箭头函数的this是指向定义时上下文环境(即上级作用域)的this,如果没有就继续找更上一级直至指向window。以上仅限于浏览器环境

image.png

image.png

解答:

function sum (n) {
  function fn (n) {
    fn.result += n
    return fn
  }
  fn.result = n
  return fn
}