zoukankan      html  css  js  c++  java
  • javascript中bind绑定接收者与函数柯里化

    如果我要遍历一个数组,
    我只要给forEach传一个匿名函数即可,很简单;

    let arr = ['a', 'b', 'c'];
    arr.forEach((item, index) => { 
        console.log(item);
        console.log(index);
    })

    如果我已经把匿名函数抽象出来,做成了一个公共的方法
    (可能其他地方也会用的到)
    那么,这个遍历会是这样的;

    let arr = ['a', 'b', 'c'];
    let myFunc = (item, index) => {
        console.log(item);
        console.log(index);
    }
    arr.forEach(myFunc);

    注意:只要把方法对象传给forEach就可以喽,参数什么的,根本就不用关心;
    如果这个方法在一个对象里,那也没什么问题:

    let obj = {
        add(param, index) {
            console.log(param);
            console.log(index)
        }
    }
    let arr = ['a', 'b', 'c'];
    arr.forEach(obj.add);

    但,如果涉及到对象的this,那就要出问题了:

    let obj = {
        name: 'allen',
        add(param, index) {
            console.log(this.name);
            console.log(param);
            console.log(index)
        }
    }
    let arr = ['a', 'b', 'c'];
    arr.forEach(obj.add);

    输出:

    undefined
    a
    0
    undefined
    b
    1
    undefined
    c
    2

    这是因为,add方法执行的时候,this对象指向的并不是obj,而是forEach的对象,forEach的对象是全局对象golobal;
    那想实现意图怎么办呢?
    最low的办法就是给forEahc在套一个匿名函数

    arr.forEach((item, index) => obj.add(item, index));

    其次是给forEach方法再多传递一个参数:

    arr.forEach(obj.add, obj);

    这也不是什么好主意,forEach你可以多传一个obj进去,其他的类似forEach的方法,可不一定允许你多传一个对象进去哦!
    更好的办法是:

    arr.forEach(obj.add.bind(obj));

    bind创建了一个新函数,这个函数跟obj.add一样,唯一不同的是,新函数把this绑定了obj
    也就是说把add方法绑定给了接收者obj;
    现在假设我们的add方法,还需要另外一个参数title,而且这是第一个参数:

    add(title, param, index) {
            console.log(title);
            console.log(param);
            console.log(index)
    }

    那该如何是好呢?
    你可以直接在bind方法里直接传递这个参数:

    arr.forEach(obj.add.bind(obj, "mytitle"));

    最终的代码是:

    let obj = {
        add(title, param, index) {
            console.log(title);
            console.log(param);
            console.log(index)
        }
    }
    let arr = ['a', 'b', 'c'];
    arr.forEach(obj.add.bind(obj, "mytitle"));

    输出结果是:

    mytitle
    a
    0
    mytitle
    b
    1
    mytitle
    c
    2

    将函数与其参数的一个子集绑定的技术称为函数的柯里化;
    比起显式的封装函数,这样做更简洁!
    (一般人也更不容易看懂你的代码,哈哈哈!)





     

  • 相关阅读:
    进程(WINAPI),遍历并查找树状的进程信息,实现控制系统进程
    HDU 4786 Fibonacci Tree(生成树,YY乱搞)
    Linux信号通讯编程
    HDU 3635 Dragon Balls(带权并查集)
    还原数据库出现“未获得排他訪问”解决方法(杀死数据库连接的存储过程sqlserver)
    java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称而且未指定默认驱动程序解决方法
    【C++基础 02】深拷贝和浅拷贝
    内核链接的简单使用
    I2C测试【转】
    [RK3288]PMU配置(RK808)【转】
  • 原文地址:https://www.cnblogs.com/liulun/p/11172390.html
Copyright © 2011-2022 走看看