zoukankan      html  css  js  c++  java
  • [Effective JavaScript 笔记]第26条:使用bind方法实现函数的柯里化

    bind方法的作用,除了有绑定函数到对象外,我们来看看bind方法的一些其它应用。

    简单示例

    例子:假设有一个装配URL字符串的简单函数。代码如下

    function simpleURL(protocol,domain,path){
       return protocol+'://'+domain+'/'+path;
    }
    

    要将特定站点的路径字符串构建为绝对路径URL。可以使用ES5中数组的map方法来实现。如下

    var paths=['wengxuesong/','wengxuesong/p/5560484.html','wengxuesong/p/5555714.html'];
    var urls=paths.map(function(path){
       return simpleURL('http','www.cnblogs.com',path);
    });
    urls;//["http://www.cnblogs.com/wengxuesong/", "http://www.cnblogs.com/wengxuesong/p/5560484.html", "http://www.cnblogs.com/wengxuesong/p/5555714.html"]

    这里功能的实现完成正确。
    但有没有可以改进的地方呢?里面每一次的迭代都使用相同的协议字符串和网站域名字符串。传给simpleURL函数的前两个参数对于迭代都是固定的,仅第三个参数是变化的。可以通过bind方法来生成一个已经包含两个参数的匿名函数。代码如下:

    var urls=paths.map(simpleURL.bind(null,'http','www.cnblogs.com'));
    

    对于simpleURL.bind的调用产生了一个委托到simpleURL的新函数。bind方法的第一个参数提供了接收者的值。这里因为不需要,所以使用null或undefined都可以。simpleURL.bind的其余参数和提供给新函数的所有参数共同组成了传递给simpleURL的参数。
    以上代码可以拆分得更细些,代码如下:

    var newSimpleURL=simpleURL.bind(null,'http','www.cnblogs.com');
    var urls=paths.map(newSimpleURL);
    

    不使用bind方法也是可以实现函数的,下面的一个版本是使用简单的函数实现,代码如下

    var noBindSimpleURL=function(path){
        return simpleURL('http','www.cnblogs.com',path);
    }
    var urls=paths.map(noBindSimpleURL);
    

    这里对比一下,bind方法提供了一种更简单的实现,结构更简单,但对于不了解bind方法的人理解起来可能有一点难度。

    函数柯里化

    将函数与其参数的一个子集绑定的技术称为函数柯里化(curring),以逻辑学家Haskell curry的名字命名。
    比起显式的封闭函数,函数柯里化是一种简洁的、使用更少引用来实现函数委托的技术。

    个人理解

    函数柯里化,只是对参数的处理,也就是简化参数。简图如下
    1465181669874

    提示

    • 使用bind方法实现函数柯里化,即创建一个固定需求参数子集的委托函数

    • 传入null或undefined作为接收者的参数来实现函数柯里化,从而忽略其接收者

  • 相关阅读:
    hdoj:2033
    hdoj:2032
    hdoj:2031
    hdoj:2029
    hdoj:2028
    hdoj:2027
    hdoj:2024
    hdoj:2023
    hdoj:2022
    hdoj:题目分类
  • 原文地址:https://www.cnblogs.com/wengxuesong/p/5563057.html
Copyright © 2011-2022 走看看