Javascript call() & apply() vs bind()?

后端 未结 22 1921
醉话见心
醉话见心 2020-11-22 02:42

I already know that apply and call are similar functions which setthis (context of a function).

The difference is with the way

相关标签:
22条回答
  • 2020-11-22 03:26

    bind: It binds the function with provided value and context but it does not executes the function. To execute function you need to call the function.

    call: It executes the function with provided context and parameter.

    apply: It executes the function with provided context and parameter as array.

    0 讨论(0)
  • 2020-11-22 03:28
        function sayHello() {
                //alert(this.message);
                return this.message;
        }
        var obj = {
                message: "Hello"
        };
    
        function x(country) {
                var z = sayHello.bind(obj);
                setTimeout(y = function(w) {
    //'this' reference not lost
                        return z() + ' ' + country + ' ' + w;
                }, 1000);
                return y;
        }
        var t = x('India')('World');
        document.getElementById("demo").innerHTML = t;
    
    0 讨论(0)
  • 2020-11-22 03:29

    Call: call invokes the function and allows you to pass arguments one by one

    Apply: Apply invokes the function and allows you to pass arguments as an array

    Bind: Bind returns a new function, allowing you to pass in a this array and any number of arguments.

    var person1 = {firstName: 'Raju', lastName: 'king'};
    var person2 = {firstName: 'chandu', lastName: 'shekar'};
    
    function greet(greeting) {
        console.log(greeting + ' ' + this.firstName + ' ' + this.lastName);
    }
    function greet2(greeting) {
            console.log( 'Hello ' + this.firstName + ' ' + this.lastName);
        }
    
    
    greet.call(person1, 'Hello'); // Hello Raju king
    greet.call(person2, 'Hello'); // Hello chandu shekar
    
    
    
    greet.apply(person1, ['Hello']); // Hello Raju king
    greet.apply(person2, ['Hello']); // Hello chandu shekar
    
    var greetRaju = greet2.bind(person1);
    var greetChandu = greet2.bind(person2);
    
    greetRaju(); // Hello Raju king
    greetChandu(); // Hello chandu shekar

    0 讨论(0)
  • 2020-11-22 03:30

    Syntax

    • call(thisArg, arg1, arg2, ...)
    • apply(thisArg, argsArray)
    • bind(thisArg[, arg1[, arg2[, ...]]])

    Here

    • thisArg is the object
    • argArray is an array object
    • arg1, arg2, arg3,... are additional arguments

    function printBye(message1, message2){
        console.log(message1 + " " + this.name + " "+ message2);
    }
    
    var par01 = { name:"John" };
    var msgArray = ["Bye", "Never come again..."];
    
    printBye.call(par01, "Bye", "Never come again...");
    //Bye John Never come again...
    
    printBye.call(par01, msgArray);
    //Bye,Never come again... John undefined
    
    //so call() doesn't work with array and better with comma seperated parameters 
    
    //printBye.apply(par01, "Bye", "Never come again...");//Error
    
    printBye.apply(par01, msgArray);
    //Bye John Never come again...
    
    var func1 = printBye.bind(par01, "Bye", "Never come again...");
    func1();//Bye John Never come again...
    
    var func2 = printBye.bind(par01, msgArray);
    func2();//Bye,Never come again... John undefined
    //so bind() doesn't work with array and better with comma seperated parameters

    0 讨论(0)
  • 2020-11-22 03:32

    bind function should be use when we want to assign a function with particular context for eg.

    var demo = {
               getValue : function(){ 
                 console.log('demo object get value       function') 
                }
               setValue : function(){  
                  setTimeout(this.getValue.bind(this),1000)           
               }
     }
    

    in above example if we call demo.setValue() function and pass this.getValue function directly then it doesn't call demo.setValue function directly because this in setTimeout refers to window object so we need to pass demo object context to this.getValue function using bind. it means we only passing function with the context of demo object not actully calling function.

    Hope u understand .

    for more information please refer javascript bind function know in detail

    0 讨论(0)
  • 2020-11-22 03:33

    It allows to set the value for this independent of how the function is called. This is very useful when working with callbacks:

      function sayHello(){
        alert(this.message);
      }
    
      var obj = {
         message : "hello"
      };
      setTimeout(sayHello.bind(obj), 1000);
    

    To achieve the same result with call would look like this:

      function sayHello(){
        alert(this.message);
      }
    
      var obj = {
         message : "hello"
      };
      setTimeout(function(){sayHello.call(obj)}, 1000);
    
    0 讨论(0)
提交回复
热议问题