柯里化currying + 隐式调用 = 一个有名的add面试题

柯里化

===================================

维基百科解释:

      柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

  总结

            1、多参数函数减少参数数量

            2、返回函数

  点评:柯里化就是一种对闭包的应用

 

优势

1、参数复用(or减少参数数量):

  创造闭包环境,在顶层作用域链缓存参数,既不会造成环境污染,又能创造最大范围的“伪全局”变量,在下级(如return的函数)作用域中使用,以达到参数复用的效果。

2、延时运行:

  如js中经常使用的bind,实现的机制就是Currying。bind也是返回一个函数

3、可以减少重复的预处理:

  比如做浏览器兼容性处理

var on = function(element, event, handler) {
    if (document.addEventListener) {
        if (element && event && handler) {
            element.addEventListener(event, handler, false);
        }
    } else {
        if (element && event && handler) {
            element.attachEvent('on' + event, handler);
        }
    }
}

var on = (function() {
    if (document.addEventListener) {
        return function(element, event, handler) {
            if (element && event && handler) {
                element.addEventListener(event, handler, false);
            }
        };
    } else {
        return function(element, event, handler) {
            if (element && event && handler) {
                element.attachEvent('on' + event, handler);
            }
        };
    }
})();

  

缺点

1、会造成内存泄漏,危害大小看使用情况

 

隐式调用

===================================

说白了就是:数据类型转换 toSting 和 valueOf,重写toSting 和 valueOf,能再对象调用时被隐式调用,是js解析器的原理,有toSting时主要用toSting,没有toSting会用valueOf来替代

经典的面试题,add叠加求和

===================================

Q:实现add 有如下结果

console.log(add(1)(2)(3))  //  6
console.log(add(1, 2, 3)(4))   //  10
console.log(add(1)(2)(3)(4)(5))   //  15
 
A:代码如下
 
function add (){
  var arr = Array.prototype.slice.call(arguments)
  var f = function (){
    arr.push(...arguments)
    return f
  }
  f.toString = function(){
    return arr.reduce((a, b) => a + b)
  }
  return f
}

  

 

posted @ 2019-09-12 19:21  刘金宇  阅读(329)  评论(0编辑  收藏  举报