JavaScript имеет лексическое охват, что означает, что нелокальные переменные, получаемые из функции, разрешаются переменными, присутствующими в области действия этой функции, когда она была определена. Это противоречит динамическому охвату, при котором нелокальные переменные, получаемые из функции, разрешаются переменными, присутствующими в области вызова этой функции при ее вызове.
x=1
function g () { echo $x ; x=2 ; }
function f () { local x=3 ; g ; }
f # does this print 1, or 3?
echo $x # does this print 1, or 2?
Вышеупомянутая программа печатает 1, а затем 2 на лексическом языке, и печатает 3, а затем 1 на языке с динамическим охватом. Поскольку JavaScript лексически охвачен, он будет печатать 1, а затем 2, как показано ниже:
var print = x => console.log(x);
var x = 1;
function g() {
print(x);
x = 2;
}
function f() {
var x = 3;
g();
}
f(); // prints 1
print(x); // prints 2