Вот некоторые основные правила в области видимости переменной в JavaScript:
- Если определенно с
var
ключевым словом, переменная функция в области видимости. То есть, переменная будет облагаться либо ближайшей содержащей функцией, либо глобальным контекстом, если нет функции, содержащей функцию. Пример:
// globally-scoped variable (no containing function)
var foo = 'bar';
function test() {
// function-scoped variable
var foo2 = 'bar2';
if (true) {
// still function-scoped variable, regardless of the if-block
var foo3 = 'bar3';
}
// see?
console.log(foo3); // --> 'bar3'
}
- Если определено с
let
ключевое слово (ES6 +), то переменная является блок-Scoped (такое поведение больше напоминает большинство других языков синтаксиса С-семейства). Пример:
// error: top level "let" declarations aren't allowed
let foo = 'bar';
function test() {
// block-scoped variable (function are blocks, too)
let foo2 = 'bar2';
if (true) {
// block-scoped variable (notice the difference
// from the previous example?)
let foo3 = 'bar3';
}
// uh oh?
console.log(foo3); // --> ReferenceError: foo3 is not defined
}
- Если определено ни с
var
или let
ключевых слов (например, foo = bar
), то переменная в области видимости глобального контекста. Пример:
// globally-scoped variable
foo = 'bar';
function test() {
// also globally-scoped variable (no var or let declaration)
foo2 = 'bar2';
if (true) {
// still a globally-scoped variable
foo3 = 'bar3';
}
}
test();
console.log(foo, foo2, foo3); // 'bar', 'bar2', 'bar3'
Во всех этих случаях, функции, определенные в области видимости переменной все еще имеют доступ к самой переменной (технически вы создаете замыкание, так как numOfLayers
и resultStr
переменные лексически в рамках ваших addToString
и doAllLayers
функций).
Обратите внимание, что правила обзора являются технически немного более нюансированными, чем это, но вам лучше читать более подробную статью на этом этапе.
В чем проблема, код выглядит хорошо для меня. – atinder
Я не уверен, правильно ли я это понял, но вы не проходите сюда, здесь этот слой является объектом, который вы передаете. – abs
@atinder - Мне просто нужно лучше понять область видимости в JavaScript –