What is the use of the JavaScript 'bind' method?

后端 未结 19 1925
自闭症患者
自闭症患者 2020-11-21 06:24

What is the use of bind() in JavaScript?

相关标签:
19条回答
  • 2020-11-21 06:55

    Summary:

    The bind() method takes an object as an first argument and creates a new function. When the function is invoked the value of this in the function body will be the object which was passed in as an argument in the bind() function.

    How does this work in JS anyway

    The value of this in javascript is dependent always depends on what Object the function is called. The value of this always refers to the object left of the dot from where is the function is called. In case of the global scope this is window (or global in nodeJS). Only call, apply and bind can alter the this binding differently. Here is an example to show how the this keyword works:

    let obj = {
      prop1: 1,
      func: function () { console.log(this); } 
    }
    
    obj.func();   // obj left of the dot so this refers to obj
    
    const customFunc = obj.func;  // we store the function in the customFunc obj
    
    customFunc();  // now the object left of the dot is window, 
                   // customFunc() is shorthand for window.customFunc()
                   // Therefore window will be logged

    How is bind used?

    Bind can help in overcoming difficulties with the this keyword by having a fixed object where this will refer to. For example:

    var name = 'globalName';
    
    const obj = {
      name: 'myName',
      sayName: function () { console.log(this.name);}
    }
    
    const say = obj.sayName; // we are merely storing the function the value of this isn't magically transferred
    
    say(); // now because this function is executed in global scope this will refer to the global var
    
    const boundSay = obj.sayName.bind(obj); // now the value of this is bound to the obj object
    
    boundSay();  // Now this will refer to the name in the obj object: 'myName'

    Once the function is bound to a particular this value we can pass it around and even put it on properties on other objects. The value of this will remain the same.

    0 讨论(0)
  • 2020-11-21 06:56

    Variables has local and global scopes. Let's suppose that we have two variables with the same name. One is globally defined and the other is defined inside a function closure and we want to get the variable value which is inside the function closure. In that case we use this bind() method. Please see the simple example below:

    var x = 9; // this refers to global "window" object here in the browser
    var person = {
      x: 81,
      getX: function() {
        return this.x;
      }
    };
    
    var y = person.getX; // It will return 9, because it will call global value of x(var x=9).
    
    var x2 = y.bind(person); // It will return 81, because it will call local value of x, which is defined in the object called person(x=81).
    
    document.getElementById("demo1").innerHTML = y();
    document.getElementById("demo2").innerHTML = x2();
    <p id="demo1">0</p>
    <p id="demo2">0</p>

    0 讨论(0)
  • 2020-11-21 06:57

    Consider the Simple Program listed below,

    //we create object user
    let User = { name: 'Justin' };
    
    //a Hello Function is created to Alert the object User 
    function Hello() {
      alert(this.name);
    }
    
    //since there the value of this is lost we need to bind user to use this keyword
    let user = Hello.bind(User);
    user();
    
    //we create an instance to refer the this keyword (this.name);
    
    0 讨论(0)
  • 2020-11-21 06:57

    The bind function creates a new function with the same function body as the function it is calling .It is called with the this argument .why we use bind fun. : when every time a new instance is created and we have to use first initial instance then we use bind fun.We can't override the bind fun.simply it stores the initial object of the class.

    setInterval(this.animate_to.bind(this), 1000/this.difference);
    
    0 讨论(0)
  • 2020-11-21 06:57

    Simple example

    function lol(second, third) {
        console.log(this.first, second, third);
    }
    
    lol(); // undefined, undefined, undefined
    lol('1'); // undefined, "1", undefined
    lol('1', '2'); // undefined, "1", "2"
    
    lol.call({first: '1'}); // "1", undefined, undefined
    lol.call({first: '1'}, '2'); // "1", "2", undefined
    lol.call({first: '1'}, '2', '3'); // "1", "2", "3"
    
    lol.apply({first: '1'}); // "1", undefined, undefined
    lol.apply({first: '1'}, ['2', '3']); // "1", "2", "3"
    
    const newLol = lol.bind({first: '1'}); 
    newLol(); // "1", undefined, undefined
    newLol('2'); // "1", "2", undefined
    newLol('2', '3'); // "1", "2", "3"
    
    const newOmg = lol.bind({first: '1'}, '2');
    newOmg(); // "1", "2", undefined
    newOmg('3'); // "1", "2", "3"
    
    const newWtf = lol.bind({first: '1'}, '2', '3');
    newWtf(); // "1", "2", "3"
    
    0 讨论(0)
  • 2020-11-21 06:57

    Another usage is that you can pass binded function as an argument to another function which is operating under another execution context.

    var name = "sample";
    function sample(){
      console.log(this.name);
    }
    var cb = sample.bind(this);
    
    function somefunction(cb){
      //other code
      cb();
    }
    somefunction.call({}, cb);
    
    0 讨论(0)
提交回复
热议问题