2013-09-01 5 views
2

Я не понимаю значение следующего яваскрипта кода:Я не понимаю значение следующего яваскрипта кода:

var func = f() 
    func() 

Может кто-нибудь себе позволить, чтобы объяснить это мне? как я уверен, я не эксперт в javascript. Полный код, который я нашел в сети Дано:

var a = 1 
function f() { 

    function g() { 
    alert(a) 
    } 

    return g 
} 

var func = f() 
func() // 1 

Он пытается показать закрытие, lexicalenvironment. любая помощь приветствуется. Я нашел его на http://javascript.info/tutorial/closures

+2

Что вы подразумеваете под «значением»? Где вы нашли код? – Pointy

+0

Может ли автор этого кода добавлять некоторые точки с запятой в некоторые места, или он исходит из фона VB? – Jivan

+0

@Pointy http://javascript.info/tutorial/closures – rosemary

ответ

1
  1. function f() объявляет функцию. Это означает, что вы можете позвонить позже, но сам код не выполняется.

  2. var func = f() вызывает функцию f и присваивает ее результат переменной func. Начиная с freturns g, func равен g (который вызывает предупреждение).

  3. И наконец, func() вызывает функцию, назначенную ему, и показывает предупреждение.

Здесь важно различать декларацию и вызов функции. func сам по себе является просто переменной с назначенной функцией, где func() фактически запускает функцию. Если это помогает, вы можете думать о func как о «указателе» на функцию (хотя на самом деле это не так). Как указывали другие, это не лучший пример закрытия, но тем более факт, что функции являются объектами в Javascript.

+0

Поскольку вопрос о закрытии, действительно важно отметить, что этот код не создает его. Значение a, которое будет предупреждено, по-прежнему определяется глобальной областью, а не локальной областью. В учебнике, цитируемом OP, более поздние функции используют аналогичную стратегию для создания настоящих закрытий. –

1

Звонок f() возвращает функцию g и присваивает ее переменной func.

Звонок func() затем выполняет g(), который отображает предупреждающее сообщение.

0

На самом деле, это не лучший пример для иллюстрации закрытия. Это просто не создает.

Для иллюстрации закрытия надлежащим образом в этом случае код должен быть следующим:

function f() { 

    var a = 1 

    function g() { 
    alert(a) 
    } 

    return g 
} 

var func = f(); 
func() // 1 

Так дело в том, что, когда функция f прибудет, оформленного возвращает функцию g, которая содержит ссылку на контекст выполнения вызываемой функции f (она содержит все переменные, объявленные внутри функции, переданные аргументы, цепочку областей и т. д.). Обычно после выполнения сборщик мусора должен был удалить контекст выполнения из памяти, но возвращаемая функция g содержит ссылку на него, поэтому она не удаляется.

Когда функция func называется, она обращается к переменной a от так называемого закрытия и предупреждает об этом, но нет другого способа получить доступ к этой переменной.

Если у вас нет глубокого понимания того, что там происходит, я предлагаю вам прочитать this article. Это довольно старый, но очень подробно объясняет эту тему.

Другой good one, который я обнаружил недавно, немного легче понять, поэтому вы можете начать с него, а затем вернуться к первому, о котором я упоминал.

Hoped это помогло немного.

Смежные вопросы