2012-05-26 2 views
2

Вот некоторые странные javascript поведение функции map в Firefox.Странное поведение javascript `map` в Firefox

Во время состояния ошибки веб-приложения (когда поджигатель останавливается на ошибке) введя в Firebug консоли:

["a", "b", "c", "d"].map(function(val, i, arr) { 
    return val + " " + i + " " + typeof arr; 
}); 

производит следующий не-ожидаемый результат:

["a undefined undefined", 
"b undefined undefined", 
"c undefined undefined", 
"d undefined undefined"] 

В это время, если я открою еще одну пустую вкладку и нахожу один и тот же оператор в Firebug Console пустой вкладки, он производит следующий ожидаемый результат:

["a 0 object", 
"b 1 object", 
"c 2 object", 
"d 3 object"] 

Это означает, что в условии ошибки map вызывает обратный вызов с 1 аргументом вместо ожидаемых 3 аргументов.

Цитата MDN: (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map)

обратного вызова вызывается с тремя аргументами: значение элемента, индекс элемента, а объект массив пересекаемой.

Является ли неожиданное поведение из-за того, что приложение форсирует firefox в каком-то режиме?

(я использую Firefox 12.0)

+0

http://jsfiddle.net/6WRqp/ --- FF12, невозможно воспроизвести – zerkms

ответ

3

Звучит так, как будто какой-то другой код в вашем приложении может переписывать функцию Array.prototype.map - возможно, не полностью выполненный полиполк? Если вы наберете [].map в консоли, и если он не скажет function map() { [native code] }, то это почти наверняка.

+0

Да ... это происходит. Впечатывание '[] .map' в условии ошибки говорит' function() 'в то время как в хорошем состоянии,' [] .map' говорит 'map()'. –

+0

Как только я увидел ваш ответ, я помню, как читал об этом, но это меня не поразило. Имеет смысл, поскольку я просто включил стороннюю библиотеку. Спасибо! –

3
>>> ["a", "b", "c", "d"].map(function(val, i, arr) { return val + " " + i + " " + typeof arr; }); 
["a 0 object", "b 1 object", "c 2 object", "d 3 object"] 

Firefox 12. Похоже, у вас есть библиотека JS, которая создает свои собственные Array.prototype.map.

Вы можете легко проверить это с помощью поджигатель:

>>> Array.prototype.map.toString() 
"function map() { [native code] }" 

Если вы не получаете [native code] функцию перезаписи функции с чем-то другим.

+0

'Array.prototype.map.toString()' показывает функцию, которая переписывает метод карты. Я просто включил внешнюю библиотеку и вот что вызывает ее. Спасибо вам! –

Смежные вопросы