js中 call() ,apply(),bing()方法三者的用法和區別


面試中經常會被問到的,或者做筆試題的時候也會有這樣的問題,所以今天專門對這個問題做個總結;

先看個例子:

var age = '19'
var myObj = {
    name:'小賴',
    myAge:this.age,
    sayName:function(){
        console.log(this.name + '今年' + this.age)
    }
}
myObj.sayName(); // 小賴今年 undefined

var hero = {
    name:'艾希',
    age:'100'
}
myObj.sayName.call(hero); //艾希今年100
myObj.sayName.apply(hero); //艾希今年100
myObj.sayName.bind(hero)(); //艾希今年100
上面的例子看出 使用call(),apply(),bind()都是用來改變this指向的;
以上除了 bind 方法后面多了個 () 外 ,結果返回都一樣! 這樣是因為bind()返回的是一個函數,必須調用才能執行。
然后我再稍微改下這個例子;
再往下看:
var myObj1 = {
    name:'小王',
    myAge:this.age,
    sayName:function(add, front){
        console.log(this.name + '今年' + this.age + '在'+add+'做'+front)
    }
}
var heros ={
    name:'艾希尼亞',
    age:'20'
}
myObj1.sayName.call(heros,'上海','前端'); //艾希尼亞今年20在上海做前端
myObj1.sayName.apply(heros,['上海','前端']); //艾希尼亞今年20在上海做前端
myObj1.sayName.bind(heros,['上海','前端'])(); // 艾希尼亞今年20在上海,前端做undefined  ;這里有錯亂
myObj1.sayName.bind(heros,'上海','前端')(); // 艾希尼亞今年20在上海做前端
myObj1.sayName.bind(heros)('上海','前端'); // 艾希尼亞今年20在上海做前端
從上面的例子可以看出call,apply, bind 這三個方法的第一個參數都是this的要指向的對象,
第二個參數就有差別了call的參數是一個一個放進去的中間用 ,參數全都用 ,逗號隔開;
apply的第二個參數都必須放在一個數組里面傳進去 數組里面的值和sayName方法中是一一對應的;
bind方法除了返回的是一個函數外 它的第二個參數和call一樣。
三者參數不只限定是字符串類型,可以是各種類型 函數,對象等都可以,另外可以看出bind方法的第二個參數還可以在調用的時候再傳。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM