2012-05-03 4 views
3
$.each(["foo","bar"],function(){console.debug(this);}); 

преобразует «foo» и «bar» типа строки в их эквивалент в строковом объекте.

тогда ...

$.each(["foo","bar"],function(i,e){console.debug(e);}); 

будет держать "Foo" и "бар" в их первоначальном строкового типа.

Интересно, почему $ .each делает преобразование? И, более того ... если это преобразование никогда не произойдет - оставите строки такими, какие они есть, будь они типа строк или строкового объекта?

ответ

1

jQuery здесь не виноват: это причуда JavaScript. Как определено в разделе 10.4.3 ECMAScript Third Edition, когда вы вызываете функцию, обрабатывается псевдо-аргумент this: в частности, нулевое значение преобразуется в глобальный объект (window), а примитивные значения автоматически помещаются в бокс:

3) Иначе, если Type (thisArg) не является объектом, установите значение ThisBinding ToObject (thisArg).

Параметры не могут быть искалечены одинаково, поэтому второй аргумент для каждого() более надежный.

Нет никакого особого обоснования для JavaScript, делая это, это всего лишь одна из сумасшедших вещей, которые Netscape сделал в тот день, которые затем должны были быть стандартизованы в ECMAScript. В строгом режиме пятого издания это любопытное поведение уходит.

2

Согласно jQuery documentation:

(значение можно также получить через это ключевое слово, но Javascript всегда будет обернуть это значение как объект, даже если это простая строка или числовое значение .)

Это указано, что это Javascript, а не jQuery, который выполняет преобразование.

В случае использования значения в функции обратного вызова, jQuery передает это значение и, следовательно, сохраняет свой тип.

+1

Я считаю, что поведение JavaScript в этом вопросе вызывает функцию [call()] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call), которая использует autoboxes primitives. –

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