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
新闻热点
疑难解答
图片精选