Получают ли внутренние и внешние функции собственную копию одной и той же переменной? - PullRequest
1 голос
/ 18 марта 2012

немного смущен этим кодом

var counter = function() {
    //...
    var count = 0;
    return function () {
        return count = count + 1;
    } 
}

var nextValue = counter();  
console.log(nextValue());
nextValue.count = 7;
console.log(nextValue());
console.log(nextValue.count);
console.log(nextValue());

Выход

1
2
7
3

Это противоречит интуиции. Есть два представления графа. Один на внешней функции nextValue и тот, который может видеть только внутренняя анонимная функция.

Правильно, или я что-то упустил?

Ответы [ 2 ]

4 голосов
/ 18 марта 2012

Выражение nextValue.count делает не ссылкой на локальную переменную "count", объявленную внутри функции. Фактически невозможно создать ссылку на локальную для функции переменную из кода вне функции. То, на что вы ссылаетесь, это просто свойство объекта функции.

Итак, да, переменная "count", к которой имеет доступ возвращенная функция, фактически полностью закрыта для этой функции, и она сохраняется в замыкании, образованном вызовом функции "counter".

Если вы действительно хотите, чтобы это сработало, вы можете сделать это:

function counter() {
  function actual() {
    return actual.count = actual.count + 1;
  }
  actual.count = 0;
  return actual;
}

изменить & mdash; (фиксированный поддельный код) имя «фактическое» внутри дает возвращаемому функции безопасный доступ к самому объекту функции; Первоначально я набрал здесь «this», и это не сработало бы, если внешний код не установил его явно.

1 голос
/ 18 марта 2012

Как вы описываете, count фактически является частной переменной.Когда вы присваиваете nextValue.count, вы создаете отдельное свойство - не обращаетесь к внутреннему count, увеличиваемому вашим счетчиком.

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