1. 程式人生 > >call、apply、bind的用法以及區別

call、apply、bind的用法以及區別

它們在功能上是沒有區別的,都是改變this的指向,它們的區別主要是在於方法的實現形式和引數傳遞上的不同
①call的用法:函式.call(物件, arg1, arg2....)
②apply的用法:函式.apply(物件,[arg1, arg2,...])
③bind的用法:var obj = 函式.bind(物件, arg1, arg2,....)

通過程式碼可以看出區別:

var name = 'window';
var age = '10'
function fun1(name){  
    console.log(name + '+' + this.name);  
}  
var person={  
    name: "people",  
    age: 20 
};  
fun1.call(person, "小明");  
fun1.apply(person, ["小明"]);  
//對於bind來說,用法更加的靈活  
var fun2 = fun1.bind(person, "小明");  
fun2();  
fun1()

看一下在控制檯的列印輸出:


bind常見用法案例:

function fun1(myFun){
    this.name = 'fun1'
    myFun(this.fun3.bind(this))   // 把this指向變為fun1
}
var fun2 = function(fn){
    this.name = 'fun2';
fn()
}
fun1.prototype.fun3 = function(){
    console.log(this.name)
}
new fun1(fun2)

控制檯輸出的是:  fun1

對比一下如果不使用bind方法:

function fun1(myFun){
    this.name = 'fun1'
    myFun(this.fun3)
}
var fun2 = function(fn){
    this.name = 'fun2';
    fn()
}
fun1.prototype.fun3 = function(){
    console.log(this.name)
}
new fun1(fun2)

控制檯輸出的是:  fun2