• 柯里化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
    }
    

      

     

  • 相关阅读:
    Web开发——HTML基础(文件和网站结构)
    Web开发——HTML基础(高级文本格式 列表/style)
    Web开发——HTML基础
    Web开发——CSS基础
    Java 输入/输出——处理流(RandomAccessFile)
    Java 输入/输出——处理流(ObjectIO)
    Java 输入/输出——处理流(DataInputStream/DataOutputStream、ByteArrayInputStream/ByteArrayOutputStream)
    关于R.layout中找不到已存在的布局文件问题
    RelativeLayout常用属性整理
    配置adb环境变量
  • 原文地址:https://www.cnblogs.com/liujinyu/p/11514756.html
Copyright © 2020-2023  润新知