2015-09-02 2 views
3
(function() { 
      var a = 'g'; 
      function foo() { 
       console.log(a); 
       a = 7; // 
      } 
      console.log(foo(), a); 
    }()); 

Может кто-нибудь объяснить пошаговое выполнение и выход этого примера кода. Я получил сообщение «g undefined 7»сфера действия на javascript и этапы выполнения

+3

Да, отладчик шагов. – Amit

+0

Я голосую, чтобы закрыть этот вопрос не по теме, потому что ответ можно получить с помощью отладчика – Amit

+1

, вы ничего не возвращаете из своей функции 'foo', поэтому' console.log (foo()) 'возвращает undefined – Pete

ответ

3

Вы создаете анонимную функцию и выполняет сразу (IIFE)

Тогда в этой области видимости функции:

  • Вы объявляете a вар со значением g
  • Вы объявляете функцию с именем foo, которая имеет видимость в области родительских функций (область IIFE). Таким образом, он может видеть var a var. Функция foo не вызывается сразу.
  • В log заявлении foo выполняется:
    • a регистрируется (значение g)
    • a вар в IIFE объем изменяется не дорожить 7
    • foo возвращает ничего
  • ли тогда зарегистрировано:
    • foo возвращает значение, которое undefined (не возвращаемое значение)
    • a значение, которое 7 после foo выполняется.

Так у вас есть в вашей консоли:

g 
undefined 7 
+0

Без IIFE также я получаю тот же результат. OK Я понял, что foo() приведет к «неопределенному», так как не существует оператора return. Но как получить значение «g» доступно внутри функции foo(). Если я добавлю «var» в «a» внутри foo(), результат станет «undefined undefined g». Это означает, что без переменной var ключевое слово 'a' станет глобальным. – user3210732

+0

В 'foo', без' var', 'a' поступает из вашей родительской области (область IIFE). Если вы добавите 'var' в' a' в функцию 'foo', вы« переопределите »' a'variable, исходящий из родительской области (функция IIFE), это называется «shadowing». 'a' var объявлен таким образом в функции' foo' доступен только в функции 'foo' (и будет доступен в гипотетических подфункциях' foo') – codename44

+0

Предлагаю вам прочитать эту хорошую онлайн-книгу: https : //github.com/getify/You-Dont-Know-JS. Глава, соответствующая вашему вопросу, находится в 3-й главе книги 2: https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20&%20closures/ch3.md – codename44

0

Это ananymous самозапускаемая функция, которая выполняется автоматически без какого-либо вызова.

И результаты/этапы исполнения являются:

  • g брошено с console.log(a);, потому что изначально мы имеем a="g".

  • undefined 7 брошен с console.log(foo(), a);:

    1. foo() вернется undefined, потому что нет return Заявления о
    2. и a вернется 7, потому что мы сделали a=7;
0
(function() { 
    ... 
    ... 
}()); 

это просто способ заявить анонимную функцию и называть его

var a = 'g'; 
function foo() { 
    console.log(a); 
    a = 7; // 
} 
console.log(foo(), a); 

здесь у объявляем переменная a = 'g' в javascript, если u объявляет переменную, используя ключевое слово "var", область этой переменной s i функция, то есть внутри этой функции (также в подфункции) каждый может ее использовать.

Затем u объявляет функцию foo, функция foo может видеть переменную a, поскольку foo объявляется внутри предыдущей функции. console.log (a) просто напечатайте значение a, чтобы он напечатал 'g', а затем изменил значение a на 7.

после объявления u call console.log (foo(), a), это означает, что u выполняет foo и печатает возвращаемое значение foo, которое является «undefined», потому что нет оператора возврата, а затем печатается значение a, которое после выполнения foo становится 7.

поэтому выход is:

g 
undefined 7 
Смежные вопросы