1. 程式人生 > 實用技巧 >JavaScript--apply&call

JavaScript--apply&call

1.基本使用 雖然在一個獨立的函式呼叫中,根據是否是strict模式,this指向undefined或window,不過,我們還是可以控制this的指向的! 要指定函式的this指向哪個物件,可以用函式本身的apply方法,它接收兩個引數,第一個引數就是需要繫結的this變數,第二個引數是Array,表示函式本身的引數。 用apply修復getAge()呼叫:
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()把引數按順序傳入。
比如呼叫Math.max(3, 5, 4),分別用apply()和call()實現如下:
Math.max.apply(null, [3, 5, 4]); // 5
Math.max.call(null, 3, 5, 4); // 5
對普通函式呼叫,我們通常把this繫結為null。
2.裝飾器效果 利用apply(),我們還可以動態改變函式的行為。 JavaScript的所有物件都是動態的,即使內建的函式,我們也可以重新指向新的函式。 現在假定我們想統計一下程式碼一共呼叫了多少次parseInt(),可以把所有的呼叫都找出來,然後手動加上count += 1,不過這樣做太傻了。最佳方案是用我們自己的函式替換掉預設的parseInt():
'use strict';

var count = 0;
var oldParseInt = parseInt; // 儲存原函式

window.parseInt = function () {
    count += 1;
    
return oldParseInt.apply(null, arguments); // 呼叫原函式 };