Javascript: «Переменная не определена» внутри функции, вызывающей себя - PullRequest
1 голос
/ 24 сентября 2011

Я написал следующий код, который выводит сумму квадратов повторяющихся чисел:

(function () {
    var i = 4, sum = 0; 
    while(i--) sum+=i*i;
})();
console.log(sum);

Проблема в том, что я получаю следующую ошибку в консоли: сумма не определена, если я не вычту сумму и не объявлю ееglobal scope: // это работает, но это не то, что я хочу.

sum = 0;    
(function ( ) {
    var i=4 
    while(i--) sum+=i*i;
})();
console.log(sum);

Может ли кто-нибудь помочь мне понять?Спасибо

Ответы [ 4 ]

5 голосов
/ 24 сентября 2011
var sum = (function ( ) {
  var i=4, sum = 0; 
  while(i--) sum+=i*i;
  return sum;
})();
console.log(sum);

Вы создали локальную переменную с именем sum и хотите использовать ее вне ее области действия. Вы не хотите объявлять это в более высоком объеме, поэтому вам нужно экспортировать это.

Единственный способ экспортировать локальные (примитивные) переменные - это оператор return.

3 голосов
/ 24 сентября 2011

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

1 голос
/ 24 сентября 2011

Поскольку вы получаете доступ к sum вне области действия вашей функции в строке: console.log(sum), где сумма не видна.

Если вы не хотите помещать sum в глобальную область, то вы должны взять оператор console.log(sum) в области действия функции.

0 голосов
/ 24 сентября 2011

вы определяете sum внутри функции, которая является локальной переменной. и печать суммы за пределами функции, которая выходит за рамки.

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