Из http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/
В javascript у вас есть функция Объявление:
function foo() {
}
и выражение функции
var foo = function() {
}
Цитата из http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and- Подъем
«Объявления функций и функциональные переменные всегда перемещаются (« поднимаются ») в верхнюю часть их области JavaScript с помощью интерпретатора JavaScript».
Итак, что произошло в вашем первом примере, это объявление функции
function a()
, которое поднимается вверху области Javascript, создавая таким образом foo, даже если if оценивает значение false. Думайте о
var foo
как обычный оператор Javascript, он выполняется только во время выполнения вашего javascript, в отличие отfunction foo()
, поэтому справедливо следующее:alert(foo()); function foo() { return 'gw ganteng'; }
Здесь
function foo()
анализируется синтаксический анализатор, поместивfoo()
в текущую область, прежде чем пытаться вызватьalert(foo())
http: // javascriptwe blog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/
При исполнении JavaScript есть контекст (который ECMA 5 разбивается на LexicalEnvironment, VariableEnvironment и ThisBinding) и Process (набор операторов, которые будут вызываться последовательно). Декларации вносят вклад в переменную среду, когда вводится область выполнения. Они отличаются от выражений (например, возврата) и не подчиняются их правилам процесса.
То, что вы видите, в основном является дизайнерским решением. Это работает JavaScript. Например, PHP аналогичен в том смысле, что доступ к не существующему индексу - это предупреждение, а не жесткая ошибка. Есть, вероятно, другие языковые примеры, которые ведут себя таким образом.
Чтобы обойти это:
Обычный способ действительно использует b = a[0] || "default"
, однако остерегайтесь поведения с ложью, но не неопределенного значения, например:
var myarray = [ 0, null, "" ];
var a = myarray[0] || "default[0]";
var b = myarray[1] || "default[1]";
var c = myarray[2] || "default[2]";
var d = myarray[3] || "default[3]";
console.log(a, b, c, d);
Если вы хотите строго проверить неопределенные значения, если использовать значения фальши, должны быть явными:
var myarray = [ 0, null, "" ];
var a = myarray[0] !== undefined ? myarray[0] : "default[0]";
var b = myarray[1] !== undefined ? myarray[1] : "default[1]";
var c = myarray[2] !== undefined ? myarray[2] : "default[2]";
var d = myarray[3] !== undefined ? myarray[3] : "default[3]";
console.log(a, b, c, d);
Выполнение JavaScript мало чем отличается от других языков программирования. JavaScript не создает промежуточный код, который создает языки, такие как C, Java (например, байтовый код). Первый этап в Javascript - это этап декларации, в котором переменные определены в соответствующей области. Область по умолчанию - глобальная область. Каждая функция создает свою собственную область в javascript.
var a = 10;
Итак, на первом этапе он определит «a» в глобальной области. Обратите внимание, что он не инициализирует его значением 10. Следующая фаза - это фаза инициализации, где значение 10 присваивается переменной var 'a'. если a не объявлено никаким значением, оно будет инициализировано как 'undefined' .
В конце вы должны помнить, что это именно так, как это делает JavaScript.
Вы можете использовать оператор in
operator , который проверяет, существует ли свойство в объекте / массиве с условным (тройным) оператором ?:
для значение или какое-то значение по умолчанию.
Этот подход также сохраняет значения falsy .
const b = 0 in aa ? a[0] : <something other than undefined>;
В будущей версии JavaScript (текущая дата 7/16/18) должно быть доступно колличество:
Вместо:
value != null ? value : 'default value';
Или:
value || 'default value'
(Числовое ноль, логическое значение false и пустая строка считаются ложными во втором решении. Очень опасно.)
Теперь мы можем сделать:
value ?? 'default value';
Документы: https://github.com/tc39/proposal-nullish-coalescing