Привязки
Каждая привязка имеет область действия, являющуюся частью программы, в которой привязка видна. Для привязок, определенных вне какой-либо функции или блока, область действия - это целая программа. Вы можете ссылаться на такие привязки где угодно. Они называются глобальными.
Но на привязки, созданные для параметров функции или объявленные внутри функции, можно ссылаться только в этой функции, поэтому они известны как локальные привязки. Каждый раз, когда вызывается функция, создаются новые экземпляры этих привязок. Это обеспечивает некоторую изоляцию между функциями. Каждый вызов функции действует в своем собственном маленьком мире (своей локальной среде) и часто может быть понят, не зная о том, что происходит в глобальной среде.
Привязки, объявленные с помощью let и const, на самом деле являются локальными для блока, в котором они объявлены, поэтому, если вы создадите один из них внутри цикла, код до и после цикла не сможет его «увидеть». В JavaScript до 2015 года только функции создавали новые области, поэтому привязки старого стиля, созданные с помощью ключевого слова var, видны во всей функции, в которой они появляются, или во всей глобальной области действия, если они не входят в данную функцию.
let x = 10;
if (true) {
let y = 20;
var z = 30;
console.log(x + y + z);
// → 60
}
// y is not visible here console.log(x + z);
// → 40
Каждая область видимости может «заглядывать» в область вокруг нее, поэтому в примере X виден внутри блока. Исключение составляют случаи, когда несколько привязок имеют одно и то же имя. В этом случае код может видеть только то, что внутри функции. Например, когда код внутри функции halve ссылается на n, он видит свой собственный n, а не глобальный n.
const halve = function (n) {
return n / 2;
};
let n = 10;
console.log(halve(100));
// → 50 console.log(n);
// → 10
Область вложения
JavaScript различает не только глобальные и локальные привязки. Блоки и функции могут быть созданы внутри других блоков и функций, создавая несколько степеней локальности.
Например, эта функция, которая выводит ингредиенты, необходимые для приготовления партии хумуса, имеет еще одну функцию:
const hummus = function(factor) {
const ingredient = function(amount, unit, name) {
let ingredientAmount = amount * factor;
if (ingredientAmount > 1) {
unit += "s";
}
console.log(`${ingredientAmount} ${unit} ${name}`);
};
ingredient(1, "can", "chickpeas");
ingredient(0.25, "cup", "tahini");
ingredient(0.25, "cup", "lemon juice");
ingredient(1, "clove", "garlic");
ingredient(2, "tablespoon", "olive oil");
ingredient(0.5, "teaspoon", "cumin");
};
Код внутри функции ингредиента может видеть привязку фактора от внешней функции. Но его локальные привязки, такие как unit или componentAmount, не видны во внешней функции.
Набор привязок, видимых внутри блока, определяется местом этого блока в тексте программы. Каждая локальная область также может видеть все локальные области, которые ее содержат, и все области видят глобальную область. Такой подход к связыванию видимости называется лексическим ограничением.
Подписывайтесь на канал "Стать программистом"
Буду очень признателен, если еще кликните на лайк под статьей, спасибо =)