JavaScript--apply&call
阿新 • • 發佈:2020-12-06
1.基本使用
雖然在一個獨立的函式呼叫中,根據是否是strict模式,this指向undefined或window,不過,我們還是可以控制this的指向的!
要指定函式的this指向哪個物件,可以用函式本身的apply方法,它接收兩個引數,第一個引數就是需要繫結的this變數,第二個引數是Array,表示函式本身的引數。
用apply修復getAge()呼叫:
2.裝飾器效果
利用apply(),我們還可以動態改變函式的行為。
JavaScript的所有物件都是動態的,即使內建的函式,我們也可以重新指向新的函式。
現在假定我們想統計一下程式碼一共呼叫了多少次parseInt(),可以把所有的呼叫都找出來,然後手動加上count += 1,不過這樣做太傻了。最佳方案是用我們自己的函式替換掉預設的parseInt():
function getAge() { var y = new Date().getFullYear(); return y - this.birth; } var xiaoming = { name: '小明', birth:另一個與apply()類似的方法是call(),唯一區別是:1990, age: getAge }; xiaoming.age(); // 25 getAge.apply(xiaoming, []); // 25, this指向xiaoming, 引數為空
- apply()把引數打包成Array再傳入;
- call()把引數按順序傳入。
Math.max.apply(null, [3, 5, 4]); // 5 Math.max.call(null, 3, 5, 4); // 5對普通函式呼叫,我們通常把this繫結為null。
'use strict'; var count = 0; var oldParseInt = parseInt; // 儲存原函式 window.parseInt = function () { count += 1;return oldParseInt.apply(null, arguments); // 呼叫原函式 };