Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос на собеседовании (https://javascript.ru/forum/misc/63850-vopros-na-sobesedovanii.html)

ibahob 04.07.2016 14:22

Вопрос на собеседовании
 
function get() {
var a = 1;
function summ() {
var b = 2;
b = b + a;
var a = 3;
return b;
}
return summ();
}
Что вернет функция get?
Ход моих мыслей такой был: смотрим в функцию summ там обьвление a и b они локальные, несмотря на то что а обьявлена в конце, интерператоро при проходе все сделает ок, и при вычеслении b = b + a; получи b= 5;
но в реалии какойто яд получился, в хроме потестил ради интереса и вообще в ауте. при прощете b=b+a у меня a = undefined !!! как такто, они при любоим раскладе не должно быть undefined, как минимум через замыкание вытянулобы а=1
как такто расстолкуйте

Яростный Меч 04.07.2016 14:36

ibahob,

на момент выполнения строки "b = b + a;" в переменной b двойка, переменная "a" здесь используется самая внутренняя (при выполнении кода объявления переменных через var переносятся в начало функции), но значение а равно undefined, т.к. 3 ей ещё не присвоилось.

Т.е. на самом деле функция summ выполнится так:
function summ() {
  var b, a; // объявили переменные, они равны undefined
  b = 2;
  b = b + a; // 2 + undefined
  a = 3;
  return b;
}

Makarov 05.07.2016 07:33

Еще раз напишу другими словами то, что написал Меч.

Ключевая штука которую Вы тут не понимаете называется hoisting.
Это то, что когда вы пишете var a; это объявление распространяется на всю текущую область видимости. То есть в данном случае где бы Вы его не написали это эквивалентно написанию в начале функции. Именно поэтому значение a не вытягивается из замыкания: переменная a уже есть в локальном скоупе, поэтому берется оттуда. Присваивание не всплывает, только объявление. Поэтому a на момент обращения равно undefined.

рони 05.07.2016 10:49

Makarov,
Яростный Меч,
спасибо!

Яростный Меч 05.07.2016 13:20

рони,
за что? неужели это был ты? :)

Rasy 05.07.2016 13:44

Яростный Меч,
даже забыл как оформлять код:lol:

рони 05.07.2016 13:46

Яростный Меч,
будет место куда я смогу послать жаждущих знаний, туговато у меня с обьяснялками, но приходится, проще написать рабочий код, чем обьяснять почему не работает чужой, да и когда коротко и по делу, лучше и в собственной голове укладывается. :)


Часовой пояс GMT +3, время: 21:30.