zoukankan      html  css  js  c++  java
  • 柯里化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
    }
    

      

     

  • 相关阅读:
    win10的power shell可以学习少部分linux命令_功能与cmd类似
    js数组的初始化
    Vue.js 学习笔记
    jquery knob旋钮插件
    jquery 城市三级联动
    xampp 配置虚拟主机
    2016 360 前端开发 面经
    2016 乐视 前端开发 面经
    主流浏览器内核及前缀
    前端代码优化方法
  • 原文地址:https://www.cnblogs.com/liujinyu/p/11514756.html
Copyright © 2011-2022 走看看