this.num = 9;
var mymodule = {
num: 81,
getNum: function() { return this.num; }
};
module.getNum(); // 81
var getNum = module.getNum;//把對象中的方法提取出來,這是方法中的this指向改變爲global,想要這個方法的this依然指向mymodule就須要使用bind綁定函數,固然也可使用call方法
getNum(); // 9, 由於在這個例子中,"this"指向全局對象
// 建立一個'this'綁定到module的函數
var boundGetNum = getNum.bind(module);
boundGetNum(); // 81
bind()方法所返回的函數的length(形參數量)等於原函數的形參數量減去傳入bind()方法中的實參數量(第一個參數之後的全部參數),由於傳入bind中的實參都會綁定到原函數的形參,嗎的,繞死了, 舉個栗子:spa
function func(a,b,c,d){...} //func的length爲4
var after = func.bind(null,1,2) //這裏輸入了兩個實參(1,2)綁定到了func函數的a,b
console.log(after.length) //after的length爲 2
after =after .bind(null,3) //這裏輸入了兩個實參(3)綁定到了after函數的c
console.log(after.length) //after的length爲 1
function original(x){
this.a=1;
this.b =function(){return this.a + x}
}
var obj={
a:10
}
var newObj = new (original.bind(obj,2)) //傳入了一個實參2
console.log(newObj.a) //輸出 1, 說明返回的函數用做構造函數時obj(this的值)被忽略了
console.log(newObj.b()) //輸出3 ,說明傳入的實參2傳入了原函數original