• js bind es5函数柯里化


    绑定函数

    bind()最简单的用法是创建一个函数,使这个函数不论怎么调用都有同样的this值。常见的错误就像上面的例子一样,将方法从对象中拿出来,然后调用,并且希望this指向原来的对象。

    如果不做特殊处理,一般会丢失原来的对象。使用bind()方法能够很漂亮的解决这个问题:

     
    this.num = 9; 
    var mymodule = {
      num: 81,
      getNum: function() { return this.num; }
    };
    
    module.getNum(); // 81
    
    var getNum = module.getNum;//把对象中的方法提取出来,这是方法中的this指向改变为global,想要这个方法的this依然指向mymodule就需要使用bind绑定函数,当然也可以使用call方法
    getNum(); // 9, 因为在这个例子中,"this"指向全局对象
    
    // 创建一个'this'绑定到module的函数
    var boundGetNum = getNum.bind(module);
    boundGetNum(); // 81

     bind()方法所返回的函数的length(形参数量)等于原函数的形参数量减去传入bind()方法中的实参数量(第一个参数以后的所有参数),因为传入bind中的实参都会绑定到原函数的形参,吗的,绕死了, 举个栗子:

    function  func(a,b,c,d){...} //func的length为4
    
    var after = func.bind(null,1,2)  //这里输入了两个实参(1,2)绑定到了func函数的a,b
    
    console.log(after.length) //after的length为 2
    after =after .bind(null,3) //这里输入了两个实参(3)绑定到了after函数的c
    console.log(after.length) //after的length为 1
     

    当bind()所返回的函数用作构造函数的时候, 传入bind()的this将被忽略,实参会全部传入原函数

    function original(x){
      this.a=1;
      this.b =function(){return this.a + x}
    }
    var obj={
      a:10
    }
    var  newObj = new (original.bind(obj,2)) //传入了一个实参2
    console.log(newObj.a)  //输出 1, 说明返回的函数用作构造函数时obj(this的值)被忽略了
    
    console.log(newObj.b()) //输出3 ,说明传入的实参2传入了原函数original

    以上就是ES5中bind方法的特性, 这种技术也被称为函数柯里化。

  • 相关阅读:
    qt学习笔记(1):qt点击运行没有反应。
    JS Object类型
    JS Boolean数据类型和数据类型转换规律
    CSS雪碧图
    CSS
    PS基础
    JS number数字类型
    js中的变量和数据类型
    JS 基础
    单词
  • 原文地址:https://www.cnblogs.com/xiaofenguo/p/7070074.html
Copyright © 2020-2023  润新知