call、apply、bind的用法以及區別
阿新 • • 發佈:2019-02-14
它們在功能上是沒有區別的,都是改變this的指向,它們的區別主要是在於方法的實現形式和引數傳遞上的不同
①call的用法:函式.call(物件, arg1, arg2....)
②apply的用法:函式.apply(物件,[arg1, arg2,...])
③bind的用法:var obj = 函式.bind(物件, arg1, arg2,....)
①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