Ajavascript
在一個對象中綁定函數,稱爲這個對象的方法:java
例:app
var xiaoming = { name: '小明', birth: 1990, age: function () { var y = new Date().getFullYear(); return y - this.birth; } }; xiaoming.age; // function xiaoming.age() xiaoming.age(); // 今年調用是25,明年調用就變成26了
其中在一個方法內部,this
是一個特殊變量,它始終指向當前對象,也就是xiaoming
這個變量。
若將函數寫在對象外部,單獨調用函數則會返回NaN,由於函數至關於全局函數,this指向了window
例:
thisxiaoming
function getAge() { var y = new Date().getFullYear(); return y - this.birth; } var xiaoming = { name: '小明', birth: 1990, age: getAge }; xiaoming.age(); // 25, 正常結果 getAge(); // NaN
B apply
(1)改變this指向
要指定函數的this
指向哪一個對象,能夠用函數自己的apply
方法,它接收兩個參數,第一個參數就是須要綁定的this
變量,第二個參數是Array
,表示函數自己的參數。
用apply
修復getAge()
調用:
例:
thisapplythisArrayapplygetAge()
function getAge() { var y = new Date().getFullYear(); return y - this.birth; } var xiaoming = { name: '小明', birth: 1990, age: getAge }; xiaoming.age(); // 25 getAge.apply(xiaoming, []); // 25, this指向xiaoming, 參數爲空
另外一個與apply()
相似的方法是call()
,惟一區別是:函數
apply()
把參數打包成Array
再傳入;網站
call()
把參數按順序傳入。this
好比調用Math.max(3, 5, 4)
,分別用apply()
和call()
實現以下:spa
Math.max.apply(null, [3, 5, 4]); // 5 Math.max.call(null, 3, 5, 4); // 5
對普通函數調用,咱們一般把this
綁定爲null
。code
(2)動態改變函數的行爲對象
例:ip
想統計一下代碼一共調用了多少次parseInt()?
解題思路:本身從新寫一個函數來替換js默認的parseInt()函數
var count = 0;
var oldParseInt = parseInt; // 保存原函數
window.parseInt = function () {
count += 1;
return oldParseInt.apply(null, arguments); // 調用原函數
};摘抄自廖雪峯老師的官方網站