Что именно означает понятие лексического контекста в JavaScript?
У меня есть следующие сомнения относительно точного значения понятия лексической области видимости в JavaScript.
Итак, из того, что я понял, это можно объяснить:
void fun()
{
int x = 5;
void fun2()
{
printf("%d", x);
}
}
показывая, что любой внутренний уровень может обращаться к переменным своих внешних уровней.
Так это понятие лексической сферы? Если да, то почему он называется lxical? что именно значит?
2 ответа
Даже если опубликованный вами код не является JavaScript, вы по сути правы. function () { … }
создает область действия, и "внутренняя внутренняя область" может получить доступ к переменным из "внешнего"
var a = 10, b = 20;
(function () {
var b = 100;
console.log(a); //10
console.log(b); //100
(function() {
var c = 333;
})();
console.log(c) //undefined
})();
Следует отметить, что область действия, в которой определена функция, сохраняется вместе с функцией. Это означает:
function A (a) {
var b = 100;
return function (c) {
console.log(a, b, c);
}
}
var afx = A(10);
afx(666); //10, 100, 666;
Тем не менее, Javascript не предоставляет блокоскоп. Так:
for (var i = 0; i < 10; i++) { … }
console.log(i) //9
переменная не "ограничена" блоком.
НО ES6 и новое ключевое слово let
, чтобы определить переменные, измените это. Так:
for (let i = 0; i < 10; i++) { … }
console.log(i); // ReferenceError: i is not defined (using babel to transpile)
Таким образом, в будущих версиях JS также возможно Blockscoping, как это:
{
let i = '#';
console.log(i); //#
}
console.log(i); // ReferenceError: i is not defined
Лексическая область видимости не зависит от контекста выполнения, как в вашем примере.
Динамическая область будет зависеть от контекста, в котором выполняется функция:
this.word = 'hello';
function saySomething() {
console.log(this.word);
}
saySomething(); // "hello"
var otherContext = {
word : "bye"
}
saySomething.call(otherContext); // "bye"