Другая проблема, с которой я встретился (который определяется, но определенно неожиданный).
символ является злым.
Фактически,
var var1 = 1, var2 = 1, var3 = 1;
не эквивалентно:
var var1 = var2 = var3 = 1;
Разница в области видимости:
function good () {var1 = 1, var2 = 1, var3 = 1; } функция bad () {var var1 = var2 = var3 = 1; } хороший(); console.log (window.var2); // undefined bad (); console.log (window.var2); // 1. Aggh!
Фактически это показывает, что присваивания являются правоассоциативными. Пример bad
эквивалентен:
var var1 = (window.var2 = (window.var3 = 1));
Назначение в javascript работает справа налево. var var1 = var2 = var3 = 1;
.
Если значение любой из этих переменных равно 1
после этого оператора, то логически оно должно начинаться справа, в противном случае значение или var1
и var2
будет неопределенным.
Его можно рассматривать как эквивалент var var1 = (var2 = (var3 = 1));
, где в первую очередь оценивается самый внутренний набор скобок.
Попробуйте следующее:
var var1=42;
var var2;
alert(var2 = var1); //show result of assignment expression is assigned value
alert(var2); // show assignment did occur.
Обратите внимание на одиночный знак '=' в первом предупреждении. Это покажет, что результатом выражения присваивания является присвоенное значение, а второе предупреждение покажет вам, что присвоение действительно произошло.
Из этого логически следует, что присваивание должно быть выполнено справа налево. Однако, поскольку это все атомарно для javascript (там '