首先是改變this指向問題函數
1 var altwrite = document.write; this
2 altwrite("hello"); spa
上面的程序運行,會報錯:Uncaught TypeError: Illegal invocation 非法調用code
報錯的緣由就是this指向問題,由於altwrite指向的是windowd對象,而write指向的是document對象對象
咱們能夠經過bind()修改altwrite的上下文,把它指向document,就能夠了,修改以下:blog
1 var altwrite = document.write; get
2 altwrite.bind(document)("hello"); string
固然也能夠使用call()
方法:it
1 altwrite.call(document, "hello") io
綁定函數
bind()
最簡單的用法是建立一個函數,使這個函數不論怎麼調用都有一樣的this值。
將方法從對象中拿出來,而後調用,而且但願this指向原來的對象。若是不作特殊處理,通常會丟失原來的對象。使用bind()
方法可以很漂亮的解決這個問題:
1 this.num = 9; 2 var mymodule = { 3 num: 81, 4 getNum: function() { 5 return alert(this.num); 6 } 7 }; 8 9 mymodule.getNum();//81 10 11 var getNumb = mymodule.getNum; 12 getNumb();// 9 這個函數裏面的this指向的是全局對象 13 14 //建立一個this綁定到mydule的函數 15 var boundGetNum = getNumb.bind(mymodule); 16 boundGetNum(); // 81