某公众号上看了一篇“一道面试题引发的对JavaScript类型转换的思考”,里面提到的面试题是这样的:
实现一个函数,满足如下功能:
1 2 3 | add(1)(2) // 3 add(1, 2, 3)(10) // 16 add(1)(2)(3)(4)(5) // 15 |
这么一个小功能,实现方法当然见仁见智,这里想说的js的function类型。
我面试前端的时候,经常问这么样一个问题:“jquery里的‘$’是个什么东西?”
对方不明白的话,就直接问“typeof $,会返回什么?”
能回答“function”的,就说明对方对js的数据类型是有了解的
对,$本身是个function,只是上面挂了各种属性和方法
这是第一点
第二点
是js的高阶函数
在学习闭包的时候,会用到高阶函数。所谓高阶函数,说白了就是一个函数,return的还是函数
上面的add(x)(x)(x),所以add肯定是高阶函数的形式
第三点
如果return的是函数,怎么得到相加后的数字
所以函数本身要带上toString(),或者valueOf()
好了,结合上面几点,下面是这个函数的实现,比预想的简单:
1 2 3 4 5 6 7 8 9 10 11 12 | function add(){ //第一层add,第一次调用时执行 var s0 = 0; //闭包参数,记录累加值 var f1 = function(){ //内层add,级联调用,实际上是调用的它 for(var i = 0; i < arguments.length; i++) s0 += arguments[i]; return f1; }; f1.toString = function(){ return s0; //返回累加值 } f1.apply(null, arguments); //第一次执行时,先add一次 return f1; } |
————-
转载请注明出处:昆仑的山头