В чем разница между undefined и not defined в JavaScript?

//ВОПРОС отсюда : что выдаст в консоли код?
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?! p.s. 1.вот НЕЯСНОЕ МНЕ объяснение автора задачи: The output would be 1undefined. The if condition statement evaluates using eval, so eval(function f(){}) returns function f(){} (which is true). Therefore, inside the if statement, executing typeof f returns undefined because the if statement code executes at run time, and the statement inside the if condition is evaluated during run time. 2.и вот иное (верное, как по мне)решение : он говорит, что тут не Function Declaration, а Function Expression, т.к. со скобки начинается объявление (хотя скобка вроде бы как часть синтаксиса if). У Function Expression её имя только локально для неё видимо. Потому интерпретатор видит что-то такое:
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? Читал ещё ответы на эту задачу, но пока не уяснил.
Изображения:

Комментарии: 2

Александр Мальцев
Александр Мальцев
Возьмём и сделаем так:
var y = 1;
if (function f(){}) {
  console.log(f);
  y += typeof f;
}
console.log(y);
В результате получим ошибку (кстати и в Chrome 62):
Uncaught ReferenceError: f is not defined
Это значит, что определение функции не поднимается и она не создаётся.
Поэтому y += typeof f; => 1undefined.
Вместо f можно указать и другую переменную, которая не существует. typeof не будет генерировать ошибку, он выдаст undefined.
Например:
typeof fdsadas
В условии любой объект всегда приводится в true. А функция — это объект. Она не является простым типом данных.
if (function f(){}) {
Serega Novikov
Serega Novikov
спасибо, приведу для читателей сайта ключевые моменты для понимания:
-в if любой объект всегда приводится в true, а function f(){} — это объект;
-в if (function f(){}) функция является Function Expression (за счет скобки) с доступной только в её Execution Context её именем f. Соответственно, её инициализация не поднимается и её имя за пределами её Execution Context не видимо.
п.с.
кстати, на англоязычных форумах эту задачу называют pointless, т.е. на практике незачем так кодить.
просто тест.