JavaScript忍者秘籍這本書中 有一段Prototype函式庫,函數bind程式碼的範例:
Function.prototype.bind = function(){
var fn = this, args = Array.prototype.slice.call(arguments),
object = args.shift();
return function(){
return fn.apply(object,args.concat(Array.prototype.slice.call(arguments)));
};
};
var myObject = {a:"1"};
function myFunction(){
return this == myObject;
};
var aFunction = myFunction.bind(myObject);
aFunction();
我用斷點看函數bind
裡面的fn指向myFunction
這個函數這個我不太懂我的理解是只要用Function.prototype
這個原型擴充的方法此方法裡面開始宣告的變數var fn=this;
中fn
#的指向就指向使用這個方法的函數就像本例中的myFunction. bind(myObject);
呼叫bin
方法,fn
指向myFunction
這個函數不知道這樣理解對不對
其實不太能懂你的提問,那咱就來用思路走一遍這個代碼吧
myFunction.bind(myObject)進入到原型得bind函數內部
將myFunction賦值給fn,將參數轉換成一個陣列args,將第一個參數刪除並賦值給object。
回傳一個函數,然後你思考下閉包這回事,然後就了解。這個函數幹的活可以簡單得理解為myFunction.apply(myObject,[...這裡是其他參數])
aFunction()
就是myFunction.apply(myObject,[...這裡木有參數])
然後進入到myFunction內部,因為apply的關係this就是myObject,然後幹的活就是myObject==myObject
回傳true