我在Fedora 19上安装了节点v0.10.28以及V8 v3.14.5.9.我遇到的问题是带有thisArg
可选参数的方法,比如Array.prototype.forEach
.
如果我在Chromium v33或Firefox v28上执行以下代码 - jsFiddle
var y = [1, 2, 3]; y.forEach(function (element) { console.log(this); }, 'hej');
我得到了一个输出
String {0: "h", 1: "e", 2: "j", length: 3} String {0: "h", 1: "e", 2: "j", length: 3} String {0: "h", 1: "e", 2: "j", length: 3}
然后相同的代码,但在严格的模式 - jsFiddle
var y = [1, 2, 3]; y.forEach(function (element) { 'use strict'; console.log(this); }, 'hej');
我得到一个输出
hej hej hej
根据ECMA5规范sec-function.prototype.call,这些是我期望的结果.
thisArg值未经修改即作为此值传递.这是对版本3的更改,其中未定义或null thisArg替换为全局对象,ToObject应用于所有其他值,并将结果作为此值传递.即使thisArg未经修改就通过,非严格模式函数在进入函数时仍会执行这些转换.
例如sec-array.prototype.foreach
如果提供了thisArg参数,则每次调用callbackfn时它都将用作此值.如果未提供,则使用undefined.
和相关的伪代码
Let funcResult be the result of calling the [[Call]] internal method of callbackfn with T as thisArgument and a List containing kValue, k, and O as argumentsList.
但是,在节点上,上述两个片段都会返回
{ '0': 'h', '1': 'e', '2': 'j' } { '0': 'h', '1': 'e', '2': 'j' } { '0': 'h', '1': 'e', '2': 'j' }
任何人都可以确认这是否是我的节点环境的问题,或者这是否与节点有关?
更新:只是为了确认,在两种情况下都typeof this
返回节点object
.