作家
登录

JavaScript高级程序设计高级技巧

作者: 来源: 2017-09-05 09:47:02 阅读 我要评论

 add(a, b) { 
  •     return a + b; 
  •   
  • let add1 = add.curry(1); 
  • console.log(add1(5)); // 6 
  • console.log(add1(2)); // 3 
  • 怎么实现如许一个curry的函数?它的重点是要返回一个函数,这个函数有一些闭包的变量记录了创建时的默认参数,然后履行这个返回函数的时刻,把新传进来的参数和默认参数拼一下变成完全参数列表去调本来的函数,所以有了以下代码:

    1. Function.prototype.curry = function() { 
    2.     let defaultArgs = arguments; 
    3.     let that = this; 
    4.     return function(){ 
    5.         return that.apply(null,  
    6.                           arguments.concat(defulatArgs)); 
    7.     } 

    然则因为参数不是一个数组,没有concat函数,所以须要把伪数组转成一个伪数组,可以用Array.prototype.slice:

    1. Function.prototype.curry = function() { 
    2.     let slice = Array.prototype.slice; 
    3.     let defaultArgs = slice.call(arguments); 
    4.     let that = this; 
    5.     return function() { 
    6.         return that.apply(null,  
    7.                           arguments.concat(slice.call(defulatArgs))); 
    8.     } 

    如今举一下柯里化一个有效的例子,当须要把一个数组降序排序的时刻,须要如许写:

    1. let data = [1,5,2,3,10]; 
    2. data.sort((a, b) => b - a); // [10, 5, 3, 2, 1] 

    给sort传一个函数的参数,然则如不雅你的降序操作比较多,每次都写一个函数参数照样有点烦的,是以可以用柯里化把这个参数固化起来:

    1. Array.prototype.sortDescending =  
    2.                  Array.prototype.sort.curry((a, b) => b - a); 

    如许就便利多了:

    1. let data = [1,5,2,3,10]; 
    2. data.sortDescending(); 
    3.   
    4. console.log(data); // [10, 5, 3, 2, 1] 

    5. 防止修改对象

    有时刻你可能怕你的对象被误改了,所以须要把它保护起来。

    (1)—Object.seal防止新增和删除属性

    如下代码,当把一个对象seal之后,将不克不及添加和删除属性:

    JS高等法度榜样设计高等技能

    当使悠揭捉?格模式将会抛异常:

    JS高等法度榜样设计高等技能


      推荐阅读

      JS高级程序设计高级技巧

    本篇是看的《JS高等法度榜样设计》第23章《高等技能》做的读书分享。本篇按照书里的思路根据本身的懂得和经验,进行扩大延长,同时指出版里的一些问题。将会评论辩论安然的类型检测、惰性>>>详细阅读


    本文标题:JavaScript高级程序设计高级技巧

    地址:http://www.17bianji.com/lsqh/37134.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)