一道简单的JavaScript面试题
好久没更新博客了,随便写点东西吧。
自从工作之后就特别忙,忙的过程中有时候挺迷茫的,可能是大多数时候写的都是简单的业务代码,很久没好好充电了。最近一直在零碎的上班路上等电梯时间里面学习《图解HTTP 》,觉得还是很有收获的。
最近一直在一边忙项目一边帮公司面试招新的前端工程师,算一算面试了很多为应聘者了,有刚刚毕业的大学生,有出来工作几年了中途转行做前端的社会人,不过总体来说并没有碰到另自己满意的人,很多虽然简历上写着已经有几个项目的经验,不过对于基础的JavaScript知识的掌握还是不够,就连如何判断一个变量是数组还是对象都很多人没写出来。本来想记一下今天工作上发生的一件事,写到这里想了想,还是不写那些没啥营养的东西了,今天咱们来说一道平时我都会用来考面试者的题吧,先说明:此题并不是我原创,而是我在腾讯的面试题上面借鉴过来,侵删。
编写一个函数 f , f 的用法如下
f(1).value //返回 1 f(1)(2).value //返回 5 f(1)(2)(3).value //返回 14
其实这道理是特别简单的一道题,逻辑思维稍微好点的都可以看得出,这其实就是参数的平方相加:
1 * 1 === 1 1 * 1 + 2 * 2 === 5 1 * 1 + 2 * 2 + 3 * 3 === 5
单从 f(1).value 可以看出,可能有些同学会以为 f(1) 返回的是 {value:1} ,所以导致他们看到 f(1)(2).value 的时候就迷惑了,为什么 f(1) 后面还可以加括号?
其实熟悉JavaScript的人都知道,在JavaScript的世界里,一切皆对象,所以函数也不例外,也是一个对象来的,所以下面的代码完全是可以执行的:
var fun = function(){}; fun.value = 1;
显而易见,f(1) 返回的其实是一个函数(姑且用 fun 代替),fun 可以接收一个参数,fun 的主体是再返回一次函数 f ,不过会把第一次执行的 f 的参数的平方传入 fun 中的 f 的第二个参数 ;然后函数 fun 还有一个value的属性,而这个value的值就是等于函数 f 的参数的平方加上第二个参数(因为第二个参数等于前一个函数 f 的参数的平方,如果没有前一个函数则默认为零)。好吧,我承认这句话可能阐述得比较绕,大家直接看代码比较清楚:
function f(val,tamp=0){ val = val*val+tamp; var fun = function(val2){ return f(val2,val); } fun.value = val; return fun; }
总结:是不是一下子觉得这道题其实很简单。其实这道题设置的一个知识点就是函数柯里化。这是一种比较好用的函数,可能各位同学在日常的开发中都会用到过,不过很有可能不知道这种函数的存在。更详细的内容各位同学自行Google吧。
《转载需标明出处》