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

Serega Novikov
Serega Novikov
1,8K
2
Содержание:
  1. Комментарии
//ВОПРОС отсюда: что выдаст в консоли код?
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?
Читал ещё ответы на эту задачу, но пока не уяснил.
Изображения:

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

  1. Александр Мальцев
    Александр Мальцев
    14.11.2017, 15:40
    Возьмём и сделаем так:
    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(){}) {
    
    1. Serega Novikov
      Serega Novikov
      14.11.2017, 23:33
      спасибо, приведу для читателей сайта ключевые моменты для понимания:
      -в if любой объект всегда приводится в true, а function f(){} — это объект;
      -в if (function f(){}) функция является Function Expression (за счет скобки) с доступной только в её Execution Context её именем f. Соответственно, её инициализация не поднимается и её имя за пределами её Execution Context не видимо.
      п.с.
      кстати, на англоязычных форумах эту задачу называют pointless, т.е. на практике незачем так кодить.
      просто тест.
    Войдите, пожалуйста, в аккаунт, чтобы оставить комментарий.