2012-05-20 5 views
2

Оператор запятой оценивает каждый операнд, разделенный запятой (и возвращает значение последнего).Javascript: Comma operator, var и scope - почему он работает так, как он делает?

(i = 1 + 2), (j = 3 + 4); 

функционально эквивалентен

i = 1 + 2; 
j = 3 + 4; 

Кроме того, насколько я знаю, заявление, таких как вар, не рассматривается в качестве оператора, а часть операнда. (См https://developer.mozilla.org/en/JavaScript/Reference/Operators/Operator_Precedence)

Таким образом, если каждый операнд быть отдельно оценены, почему же тогда

function foobar() { 
    var i = 3, j = 7, z; 
} 

создать 3 переменные - I, J, г - в рамках FOOBAR в?

Я знаю, что это на самом деле происходит, но я некоторое время задавался вопросом, почему это происходит на самом деле. Казалось бы, я должен быть в сфере foobar, но j и z должны оказаться в глобальном масштабе.

ответ

4

Запятые запятые, используемые в заявлении var, фактически не являются операторами запятой.

Аналогично, запятые, которые вы используете для разделения аргументов в вызове функции, также не являются операторами запятой.

+0

Есть ли ссылки на это требование? Я не вижу, что это действительно указано в https://developer.mozilla.org/en/JavaScript/Reference/Statements/var – BrianFreud

+0

А, я действительно вижу это в тексте примера в https: //developer.mozilla .org/ru/JavaScript/Reference/Operators/Special/Comma_Operator. Я думаю, это крошечная разница, которая делает ее «почти почти той же», а не «той же» ... – BrianFreud

+0

Ссылка: оператор 'var' имеет запятую [указанную как свой собственный синтаксический элемент] (http://www.ecma-international.org/ecma-262/6.0/#sec-variable-statement) (спецификация ECMAScript) –