1.使用apply方法將調用bind方法的函數裡面的this指標替換為object。
2.將傳遞到這個匿名函數裡面的參數轉換為數組,與args數組組合形成一個新的數組,傳遞給__method方法。
var args = Array.prototype.slice.call(arguments)將這條代碼簡寫來看可以成為這樣[].slice.call(arguments);但是這樣會給記憶體裡增加一個空的數組對象,為了容易閱讀點在簡化可以把它假看成為這樣的形式slice.call(arguments),去掉call可以假看成為這樣的形式function slice(arguments){….},其實在slice就是一個為所有數組定義好的prototype方法而已它與我們自訂的原型方法不同的是,它是javascript為開發人員預先定義好的內建方法,他只能被數組調用。mickey在編輯器裡面alert(Array.prototype.slice)之後得到的就是funciton slice(){…}。
既然slice也只是一個普通函數方法,slice.call(object)這樣讓slice裡面的this臨時的被替換一下也是可以的。就如[].slice(){..}裡面的this指標會指向調用slice方法的數組對象一樣。使用call方法或apply方法可以將調用此方法的對象內的this指標臨時性的改變為傳遞參數中的第一個參數,這一切都是臨時性的,它會在函數執行完畢記憶體釋放後重設。
var object=args.shift()將數組中的[0]位置的對象儲存到object變數,這個object就是要被替換的指標。
Js代碼 function o(){ this.num = 1; var fn = function(arg){alert(this.num+arg)}.bind(this,2); fn(); } new o()
代碼的第3行:一個匿名函數調用了bind方法,並傳遞o對象和一個數字2到bind函數裡面,這兩個傳遞過去的參數都將被轉換成為數組形式,o對象會被單獨提取出來放入object裡。之後bind函數調用完畢,返回一個函數儲存到 fn變數裡邊,現在fn變數裡儲存了bind函數的返回函數,fn裡面的內容就文章第一個代碼塊的第五行到第七行。
代碼第4行:調用fn函數,或者說是在調用bind函數的傳回值。這時候會彈出數字“3”。