this可以看做是forEach()方法的隱含參數.滿足下面這三條規則的對象都可以調用forEach()方法,都可以作為這個隱含的this:
•具有length屬性: this.length
•能夠通過索引訪問對象元素: this[i]
•能夠檢查屬性的存在性: i in this
arguments對象(包含了一次函數調用的所有實參)不是一個Array實例,所以它不能直接調用forEach()方法.但是你它滿足調用forEach方法的三個條件.為了讓該對象能夠調用到forEach()方法,我們只需要讓隱含的this參數作為顯式參數.幸運的是,每個函數都有call()方法讓我們來做件事:
代碼如下:
function printArgs() {
Array.prototype.forEach.call(arguments, function (elem, index) {
console.log(index+". "+elem);
});
}
forEach.call()比forEach()方法多一個參數:它的第一個參數就是指定的this值:
代碼如下:
> printArgs("a", "b")
0. a
1. b
JavaScript中有幾個類似的通用方法都可以以這種方式來調用,這些方法大部分來自Array.prototype.
3.反科里化this的幾個用途
用例1:通過map()調用一個方法. Array.prototype.map()方法允許你在一個數組中的每個元素上調用一個函數.但如果你想調用的不是函數還是方法呢?可以利用反科里化this這么做:
代碼如下:
> var toUpperCase = String.prototype.toUpperCase.uncurryThis();
> [ "foo", "bar", "baz" ].map(toUpperCase)
[ 'FOO', 'BAR', 'BAZ' ]
用例2:將一個通用方法轉換成函數. 利用反科里化this可以將一個方法轉換成一個用法更簡單的函數.比如:
代碼如下:
Array.forEach = Array.prototype.forEach.uncurryThis();
function printArgs() {
Array.forEach(arguments, function (elem, index) {
console.log(index+". "+elem);
});
}
在未來版本的ECMAScript規范建議中已經有了很多類似的數組方法.
譯者注:Firefox已經實現了Array.map
新聞熱點
疑難解答
圖片精選