Какая из нескольких функций JavaScript с одинаковыми именами на самом деле называется? - PullRequest
1 голос
/ 31 мая 2011

Я пробую этот тест в консоли Chrome: Тест

Я не могу понять, почему ответ для этого кода 2

 (function f(){
          function f(){ return 1; }
          return f();
          function f(){ return 2; }
        })();

Какой f называется в этой строке return f();? Какова последовательность функций?

Ответы [ 3 ]

7 голосов
/ 31 мая 2011

Функции находятся в области видимости (поэтому функция внутри функции с одинаковым именем переопределяет внешнюю функцию только при вызове внутри нее) и поднимается (поэтому не имеет значения, где они появляются в порядке кода), а последняя перезаписывает первый.

2 голосов
/ 31 мая 2011

Во время компиляции объявления будут перемещены в область действия f . Это будет выглядеть во время выполнения:

 (function f(){
      function f(){ return 1; }
      function f(){ return 2; }
      return f();
  })();

jАди пример будет выглядеть так:

(function() { 
    var hello;   
    if( false ) {
        hello = 10;
    }
    console.log( hello );
}());
2 голосов
/ 31 мая 2011

Проблема и ответ на этот вопрос - то, что многие называют Hoisting.

Подобные объявления функций интерпретируются как parsing time, а не при выполнении. Проще говоря, второе объявление функции f() перезаписывает первое, и поэтому возвращаемое значение равно 2.

Подъем происходит на function declarations и scoped variables (объявляется с var). Например:

(function() {    
    if( false ) {
        var hello = 10;
    }

    console.log( hello );
}());

console.log вернет undefined и не выдаст здесь исключение. Даже если if statement никогда не встречается, переменная была объявлена ​​в function context.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...