2015-10-15 2 views
3

В приведенном ниже коде есть функция обратного вызова, используемая для цикла forEach, возвращающего результаты. Является ли переменная 'error' внутри forEach loop и 'error' в обратном вызове одинаковыми переменными?Область переменной JavaScript внутри цикла forEach

session.getAll(options, function (error, varbinds) { 
    varbinds.forEach(function (vb) { 
     if (error) 
      console.log('getALL Fail '); 
     else    
      console.log(vb.value);    
    }); 
}); 
+2

, если внутренняя сфера функция не вводит новую переменную «Ошибка», то это будет то же самое. – rlemon

+1

У вас нет другой переменной 'error', поэтому ответ будет ** да **. –

+1

Как утверждают другие, да, если он не переопределен с помощью 'var' в цикле, однако цикл' forEach' не может быть прерван. Поэтому проверка ошибки должна выполняться в обратном вызове, прежде чем вы войдете в цикл. Если вам нужно проверить цикл по какой-либо причине, следует использовать другой метод петлирования. – ste2425

ответ

2

Да, это та же переменная, она изменится, если определить другую error переменную внутри сферы обратного вызова Foreach с помощью var ключевого слова:

session.getAll(options, function (error, varbinds) { 
    varbinds.forEach(function (vb) { 
     if (error) //Same error as the error parameter above 
      console.log('getALL Fail '); 
     else    
      console.log(vb.value);    
    }); 
}); 

session.getAll(options, function (error, varbinds) { 
    varbinds.forEach(function (vb) { 
     var error = false; //New error for this closure. 
     if (error) 
      console.log('getALL Fail '); 
     else    
      console.log(vb.value);    
    }); 
}); 
2

Да, это одно и то же переменная.

Я не уверен, насколько вы знаете. Итак, я подробно объясню. Область видимости в JavaScript находится на уровне функции. Подумайте о определениях функций как о точках на дереве. Каждая точка дерева является областью. При использовании переменной вы можете использовать только то, что находится в вашей текущей области действия, и все, что доступно предкам, поднимающимся вверх (глобальная область). Вот несколько правил & примеры, которые могут помочь вам лучше понять:

Внутренние функции имеют доступ к внешним переменным функции уровня

function a() { 
    var a = 4; 

    function b() { 
     alert(a); /* a = 4 */ 
    } 
} 

Параметры определяются в том же объеме, как если бы они были определены одна строки ниже

function a(a) { 
    // variable "a" is at same scope as the example above 

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

прилегающей функции не доступна

Функция a() является родительской. getValue() и c() - это дети. Эти дети не могут получить доступ к переменным друг друга.

function a() { 

    function getValue() { 
     var aValue = 2; 
    } 

    function c() { 
     alert(aValue); /* "aValue" is undefined here */ 
    } 
} 

Расположение определения функции, что имеет значение

Это возвращает 5, если вы запустите main();:

function getValue(returnFunc) { 
    var a = 7; 
    alert(returnFunc()); 
} 

function main() { 
    var a = 5; 
    getValue(function() { return a; }); // anonymous function becomes "returnFunc" 
} 

Наконец, переменная наиважнейшая

(function getValue() { 
    var a = 5; 

    (function() { 
     var a = 7; 
     alert(a); 
    })(); 

    alert(a); 
})(); 

Я попытался избежать использования самозапускаемых функций/IIFE для этих примеров, но я просто не мог помочь себе в этом последнем. Думаю, это самый простой способ. Выполнить это, и вы получите 7, то 5. Но, если исключить «вар» на том, что внутренний «а» ...

(function getValue() { 
    var a = 5; 

    (function() { 
     a = 7; 
     alert(a); 
    })(); 

    alert(a); 
})(); 

Вы получите 7, 7. Это происходит потому, что «вар» создает новое пространство в памяти. Кроме того, если есть конфликт имен с чем-то в более высокой области, он становится переопределенным как другая переменная (несмотря на одно и то же имя).

Для более некоторые примеры, пожалуйста, см: What is the scope of variables in JavaScript?

Смежные вопросы