Проблема с областью Javascript: переменная не определена - PullRequest
2 голосов
/ 03 сентября 2011

У меня есть две функции, одна функция вызывает другую.

Ниже приведена простая аналогия с созданной мной структурой кода:

function test1(){
    alert(a);//a is not identified here even when test1() is called under test2 which has a defined in scope
    alert(b);//b is identified here
}

function test2(){
    var a       =       'a';//Defining a
    test1();//Calling test1()
}
var b   =   'b';
test2();

Согласно приведенному выше коду, функция test1 () может идентифицировать переменную b, но не переменную a.

Мой вопрос таков: почему переменная a не входит в область действия функции test1, даже если мы вызываем test1 () внутри test2 (), который определяет переменную a?

Заранее спасибо.

Ответы [ 5 ]

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

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

Обратите внимание, что b получает "hoisted" , так что вашкод на самом деле делает это:

var b; // push b on scope chain

function test1(){ // store scope chain [b]
    alert(a);
    alert(b);
}

function test2(){ // store scope chain [b]
    var a; // push a on scope chain
    a = 'a';
    test1(); //Calling test1() which still has scope chain [b], not [b,a]
}
b   =   'b';
test2();
3 голосов
/ 03 сентября 2011

ваше ожидание неверно в отношении области видимости переменных,

в соответствии с вашим кодом b является глобальной переменной для 2 функций, а a входит в область действия test2 только потому, что онаопределяется с помощью test2, если вы хотите что-то, как вы ожидали, вы можете определить test1 функцию в test2 области видимости, как это,

function test2(){
    var a       =       'a';
    test1();
  function test1(){
      alert(a);
      alert(b);
   }
}
var b   =   'b';
test2();
2 голосов
/ 03 сентября 2011

Рекомендуется вызывать функции с аргументами.Это сделает ваш код легко читаемым и обслуживаемым.Простое добавление аргументов в функции делает код работоспособным:

function test1(a,b){
    alert(a);
    alert(b);
}

function test2(b){
    var a = 'a';
    test1(a,b);
}
var b = 'b';
test2(b);

Если вы не хотите использовать аргументы в объявлениях функций, решение состоит в том, чтобы использовать объект arguments * внутриcode:

function test1(){
    alert(arguments[0]);
    alert(arguments[1]);
}

function test2(){
    var a = 'a';
    test1(a,arguments[0]);
}
var b = 'b';
test2(b);

Если хотите, вы можете задать аргументы со значениями по умолчанию .Поскольку в JavaScript вы не можете сделать это в списке аргументов функции, это делается в теле функции:

function test1(a,b){
    a = a || 'a';
    b = b || 'b';
    alert(a);
    alert(b);
}
function test2(b){
    var a = 'a';
    test1(a);//here b is not passed to the function and b will get the default value
}
var b = 'some new string for b';
test2(b);

Live on jsfiddle

2 голосов
/ 03 сентября 2011

JavaScript имеет «область действия функции», что означает, что все, что определено в функции, не видно вне функции.Таким образом, переменная 'a' не видна за пределами test2.Тем не менее, переменная 'b' является глобальной переменной, поэтому она видна в любой области видимости.

Область действия функции также означает, что внутренние функции получают доступ к вещам, определенным во внешней функции, но которые не вступают в действие здесь... test1 вызывается из внутри test2, но это не внутренняя функция test2.Чтобы увидеть это в действии, вам нужно определить тело функции test1 внутри test2 ...

function test2(){
    var a       =       'a';//Defining a
    test1();//Calling test1()

    function test1(){
        alert(a);//a is identified here because of function scope
        alert(b);//b is identified here because it's global
    }
}
0 голосов
/ 03 сентября 2011

В соответствии с вашими функциями вы объявили и определили переменную " a " в функции " test2 () ", поэтому область действия переменной " a"ограничено самой функцией, и доступ к переменной вернет" undefined". Но это не относится к переменной " b ", которая объявлена ​​и определена глобально, поэтому к ней можно получить доступ в любом месте части скрипта.

надеюсь, это поможет вам.

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