2016-11-22 20 views
0

В операторе MDN запятой описывается:В Javascript: почему var a, b = 3 возвращает undefined, а b = 3 - нет?

The comma operator evaluates each of its operands (from left to right) and returns the value of the last operand.

Но почему

var a, b = 3 

возвращения undefined, в то время как выражение

b = 3 

вернет 3, не так ли?

+5

Это не оператор запятой, и 'вар б = 3' не является выражением. – JJJ

+0

Попробуйте в консоли: 'ReferenceError: a не определен' –

+0

' var' всегда возвращает 'undefined'. Попробуйте в консоли: 'var a = 5;'. 'var a, b = 3' объявляют 2 переменные,' a (еще не введены) 'и' b (inited, = 5) '. Если вы ненавидите области действия, вы можете объявить все переменные в верхней части файла: 'var camera, scene, renderer, startTime, stats'. Запятая используется для объявления нескольких переменных в одном выражении 'var'. –

ответ

1

Это:

var a, b = 3; 

является VariableStatement. VariableStatement оценки в "нормальном" завершение к empty:

  1. Let next be the result of evaluating VariableDeclarationList.
  2. ReturnIfAbrupt(next).
  3. Return NormalCompletion(empty).

Это:

b = 3; 

является ExpressionStatement. ExpressionStatement вычисляется в результате вычисления выражения:

  1. Let exprRef be the result of evaluating Expression.
  2. Return ? GetValue(exprRef).
+0

Да, я проверяю документ тоже. var a, b = 3 - VariableStatement, состоящий из ключевого слова var и (a & b для VariableDeclaration), а число 1 - выражение для выражения. В документе EMCA также говорится. Оператор var объявляет переменные, которые привязаны к переменной VariableEnvironment исполняемого контекста выполнения. Переменные Var создаются, когда их содержащая Лексическая среда создается и инициализируется неопределенной при создании ... для более подробной информации см. Https://www.ecma-international.org/ecma-262/7.0/index.html#prod- ВыраженияПрисваивания –

2
var a, b = 3; 

То же самое, как:

var a; 
var b = 3; 

Объявление переменной (var ключевое слово) не является выражением. Запятые в объявлениях переменных более похожи на запятые в списках аргументов функций. Они ничего не возвращают.

Верно, что оператор запятой возвращает последний элемент, но я не уверен, что он имеет какие-либо практические варианты использования (вне инициализации цикла for).

> 1, 2, 3 
< 3 

The page you linked to действительно объясняет это довольно хорошо.

+0

«Объявление переменной (ключевое слово var) не является выражением« - well, 'b = 3;» также не является выражением, это выражение «ExpressionStatement». Речь идет не о выражении, а о том, что спецификация говорит, что она должна оценивать. – lexicore

+0

Вопрос о практическом использовании оператора запятой: [Когда полезен оператор запятой?] (Https://stackoverflow.com/questions/9579546/when-is-the-comma-operator-useful) –