题目:
// 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打印一个匿名空函数看看:
由上可以看出来,匿名函数是一个name属性为空字符串的对象,它的原型链最终都是指向Object()。
那么知道这个之后我们就要想如何能往函数上面加自定义属性?用this吗?
这里又涉及到this指向的问题了,普通函数的this是谁调用指向谁,箭头函数的this是指向定义时上下文环境(即上级作用域)的this,如果没有就继续找更上一级直至指向window。以上仅限于浏览器环境
解答:
function sum (n) {
function fn (n) {
fn.result += n
return fn
}
fn.result = n
return fn
}