У меня есть node v0.10.28, установленный вместе с V8 v3.14.5.9 на Fedora 19. Проблема, с которой я сталкиваюсь, связана с методами, которые имеют необязательный аргумент 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, где undefined или 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.
В node оба приведенных выше фрагмента возвращают
{ '0': 'h', '1': 'e', '2': 'j' }
{ '0': 'h', '1': 'e', '2': 'j' }
{ '0': 'h', '1': 'e', '2': 'j' }
Может ли кто-нибудь подтвердить, является ли это проблемой в моей среде node, или если это проблема с node?
Обновление: просто для подтверждения, в обоих случаях на node typeof this
возвращается object
.