В большинстве (если не во всех) императивных языках программирования любые аргументы, передаваемые в вызов функции, должны быть оценены перед вызовом функции (так называемая Стремительная оценка ).Кроме того, они обычно оцениваются в порядке слева направо (для C, например, он не определен), однако в обоих примерах порядок, в котором оцениваются аргументы, не имеет значения.Это должно быть довольно очевидно при рассмотрении того, что происходит в деталях:
Как уже упоминалось, прежде чем можно вызвать console.log
, сначала нужно выполнить storage.get()
, возвращая массив store
.Затем будет выполнено storage.add('hi there #2')
(или наоборот), поэтому его результат (в данном случае undefined
, поскольку add
ничего не возвращает) может быть передан в качестве третьего аргумента console.log
.Это означает, что когда-то console.log
будет вызываться с аргументами (storage, storage.store, undefined)
, массив store
уже содержит "hi there # 2", следовательно, вы получите результаты, которые вы наблюдаете.
Во втором примерерассуждение опять то же самое, вызов функции немного более скрыт.На первый взгляд кажется, что есть функция, переданная в качестве третьего аргумента функции console.log
;но на самом деле это вызов функции (наблюдайте за ()
в конце).Таким образом, storage.add('hi there #2')
будет выполнен, затем console.log('TESTING')
, а затем результат undefined
от выполнения анонимной функции снова будет передан в console.log
.
Если вы действительно передали функцию в console.log
, это напечатало бы это определение функции, и ничего не выполнило бы.Итак:
storage.add('hi there')
console.log(storage, storage.get(), (function() {
storage.add('hi there #2');
console.log('TESTING');
}));
, без ()
в конце, приводит к:
Object
["hi there"] function () {
storage.add('hi there #2');
console.log('TESTING');
}
Надеюсь, это немного прояснит ситуацию.