2014-07-23 3 views
0

Если мы имеем эту основную функцию (и ее закрытие):Почему новые вызовы этой функции создают новые цепочки областей и новые частные переменные?

function counter(){ 
    var n = 0; 
    return { 
     count: function() {return n++}, 
     reset: function() {n = 0} 
    }; 
} 

Является это, что происходит в памяти? (в основном указатель на функциональный объект и его цепочку) function diagram http://www.geraldleroy.com/function-diagram.jpg

Правильно ли приведенная выше диаграмма? Если это так, я не понимаю, почему эти две строки кода создают две новые цепочки областей и новые частные переменные:

var c = counter();

var d = counter();

Похоже, как с и d будет ссылаться на оригинальных объект функции и будет использовать свою цепочки области.

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

Спасибо!

+2

Термин, который вы ищете, является «закрытием». – elclanrs

+0

Быстрый вопрос: вы понимаете, как вызовы функций работают на других, нефункциональных языках? C например? Как вы знаете, что такое стек вызовов (или запись активации)? – slebetman

+0

Эй, там. Спасибо, что ответили. Да, я знаком со стеками вызовов, которые используются в архитектуре языка C. Наверное, у меня есть небольшая проблема с пониманием эквивалентной архитектуры в JavaScript (хотя я знаю, что JavaScript не основан на стеке). – Gerald

ответ

0

Java-скрипт является «лексически ограниченным». Это означает, что они запускаются в области, в которой они определены, а не области, из которой они выполняются. Вы определяете 2 определения переменных, которые получают объект, возвращаемый функцией, поэтому вы получаете 2 области.

1

Цепи цепи здесь не применимы. Посмотрите «контекст выполнения» и «объект активации», чтобы понять, что происходит при вызове функции. См. Краткое изложение этих концепций на http://dmitrysoshnikov.com/ecmascript/javascript-the-core/

Ваш оператор return содержит объектный литерал. Таким образом, каждый раз, когда вызывается counter, в памяти создается новый объект.

+0

Благодарим за отправку ссылки на информацию о пользователе Дмитрия Сошникова. Я нашел его информацию чрезвычайно полезной! Это помогло мне понять ответ на мой вопрос: каждый раз, когда вызывается функция, создается новый контекст. Новый контекст выполнения включает три элемента: объект активации/переменной, ссылку на область действия и значение «это». Каждый новый объект активации содержит свои личные копии локальных переменных внешней функции. Еще раз спасибо. – Gerald

0

В основном, что происходит здесь, заключается в том, что при вызове функции counter() создается новый частный счетчик-n и объект, который содержит две функции, которые могут обращаться к этой частной переменной, поэтому ее нельзя удалять, пока ваш возвращенный объект не уничтожается. Также все, что находится внутри вашей функции, не привязано ни к чему, то есть если ваш объект, который вы возвращаете, будет определен где-то в другом месте, и вы только вернете его ссылку - эта функция создаст новый счетчик n, и ваш объект теперь будет ссылаться на новый счетчик n, но старый будет утилизирован.