var y = 1;
if (function f(){}) {
y += typeof f;
}
console.log(y);
//Chrome выводит 1function (я согласен с ним)
//почему в Opera и FF в консоли не 1function, а 1undefined?
//рассуждаем, как ведет себя движок:
-function declaration is hoisted to the top of the containing scope
-if видит текст "function f()", т.е. true
-т.е.выполняется:
function f(){};
var y = 1;
if ("function f()") {
y += typeof f;
}
console.log(y);//откуда берется 1undefined?!
//ведь console.log(typeof function f(){}) // => function?!

var y = 1;
if (function f (){}) {
y += typeof smth;
}
console.log(y);// 1undefined
вопросы 1-3 ниже остаются:
1. Действительно функция в if выполняется и возвращает undefined, как говорит автор вопроса в "inside the if statement, executing typeof f returns undefined because the if statement code executes at run time"?
Я думаю, что нет, так как:
var y = 1;
if (function f (){return 22}) {
y += typeof f;
}
console.log(y)//1function в Chrome или 1undefined в FF (а иначе возвращал бы 23)
2.то есть в if (function f (){}) {} имеем Function Expression? Из-за скобки? Но тогда почему if (boolean){function f (){}} всегда трактуется как Function Declaration, и, хотя вкладывать нельзя Function Declaration в {}, в if (boolean){function f (){}} будем иметь Function Declaration, хоть перед ней и идет { ?
3.И всё же почему разные браузеры по-разному в консоли выводят результат (1function в Chrome или 1undefined в FF ), ведь в Opera после 14.0 и Chrome стоит движок один и тот же: WebKit?
Читал ещё ответы на эту задачу, но пока не уяснил.Изображения:
В результате получим ошибку (кстати и в Chrome 62):
Это значит, что определение функции не поднимается и она не создаётся.
Поэтому y += typeof f; => 1undefined.
Вместо f можно указать и другую переменную, которая не существует. typeof не будет генерировать ошибку, он выдаст undefined.
Например:
В условии любой объект всегда приводится в true. А функция — это объект. Она не является простым типом данных.
-в if любой объект всегда приводится в true, а function f(){} — это объект;
-в if (function f(){}) функция является Function Expression (за счет скобки) с доступной только в её Execution Context её именем f. Соответственно, её инициализация не поднимается и её имя за пределами её Execution Context не видимо.
п.с.
кстати, на англоязычных форумах эту задачу называют pointless, т.е. на практике незачем так кодить. просто тест.