javascript-call、apply、bind區別
阿新 • • 發佈:2020-07-21
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 的所有引數都必須放在一個數組裡面傳進去