1. 程式人生 > 實用技巧 >javascript-call、apply、bind區別

javascript-call、apply、bind區別

javascript-call、apply、bind區別

this.name = "gigi";
this.age = 22;
var star = {
    name:"yoyo",
    age:23,
    _age:this.age,
    print(){
        console.log(this.name + " " + this.age + " " + this._age);
    }
}
star.print();//yoyo 23 22

可以看到第一個this指向的都是star物件,star物件裡_age指向的this是全域性

call()、apply()、bind() 都是用來重定義 this 這個物件的

star.print.call(this);//gigi 22 undefined
star.print.apply(this);//gigi 22 undefined
star.print.bind(this)();gigi 22 undefined

 可以看到this指向都指向全域性了全域性沒有_age屬性,故打印出undefined,bind 返回的是一個新的函式,你必須呼叫它才會被執行,故得在後面加多個()

對比call 、bind 、 apply 傳參情況下

var person1 = {
    name:"行運茶",
    print:function(arg1,arg2){
        console.log(
"My name is " + this.name + arg1 + arg2); } } var person2 = { name:"快樂水", print:function(arg1,arg2){ console.log("My name is " + this.name + arg1 + arg2); } } person1.print.call(person2,"好","帥");//My name is 快樂水好帥 person1.print.apply(person2,["好","帥"]);//My name is 快樂水好帥 person1.print.bind(person2,
"好","帥")();//My name is 快樂水好帥

call 、bind 、 apply 這三個函式的第一個引數都是 this 的指向物件,第二個引數就不一樣,call和apply是一樣的,直接接放進去的,第二第三第 n 個引數全都用逗號分隔

apply 的所有引數都必須放在一個數組裡面傳進去