Вопрос, связанный с ключевым словом var в JavaScript - PullRequest
1 голос
/ 16 марта 2011

Кто-нибудь знает, почему последнее предупреждение в приведенном ниже коде жалуется, что a не определено. Разве не должно быть 11, потому что оно инициализируется в four () без использования ключевого слова var? Спасибо.

function three() {
  var a = 12
  function four() {
    a = 11
    function five() {
      alert(a)
    }
    return five
  }
  return four
}
three()()()
alert(a)

Ответы [ 6 ]

2 голосов
/ 16 марта 2011

Нет, поскольку a был объявлен с помощью "var", присваивание a in four () относится к этой объявленной переменной, а область действия a ограничена тремя ().

1 голос
/ 16 марта 2011

var a находится в локальном объеме функции three()

0 голосов
/ 16 марта 2011

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

Это должно дать значение a

function three() 
{
    var a = 12;
    function four() {
        a = 11;
        function five() {
            return a;
        }
        return five;
    }
    return four;
}

var b = three()()();
alert(b);
0 голосов
/ 16 марта 2011

Кроме того, поскольку мы обсуждаем область видимости в JS, я хотел бы отметить, что в JavaScript нет блочной области видимости, только функции и глобальные.Каждый раз, когда вы пропускаете var, объявление фактически является глобальным.Это застает многих врасплох.

0 голосов
/ 16 марта 2011
function three() {
    var a = 12
    function four() {
        a = 11
        function five() {
             alert(a)
         }
    return five
    }
return four
}
three()()()
alert(a)     

Проще говоря, a не определено, потому что, ну, оно не определено.

У вас нет переменной вне ваших функций.Чтобы существенно упростить это, вещи внутри набора curly не существуют вне этого набора curly.

Вы можете определить это перед функцией или передать в функцию, чтобы исправить это

function three() {
    a = 12
    function four() {
        a = 11
        function five() {
             alert(a)
         }
    return five
    }
return four
}
three()()()
alert(a)     

Редактировать для комментария: Переменные, объявленные без var, всегда глобальные , поэтому избавление от var в 3 сделало бы это.

0 голосов
/ 16 марта 2011

Последнее предупреждение жалуется на то, что оно не определено из-за проблемы scope . Поскольку a был объявлен внутри функции, последняя строка (ваше предупреждение) не имеет абсолютно никакого представления о.

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