Проблема с областью действия в Javascript

Мне нужно получить некоторую информацию о проблеме области видимости в Javascript. Я знаю, что он поддерживает лексическую (статическую) область видимости, но разве она не поддерживает и динамическую область видимости? Если вы знаете что-нибудь об области видимости в Javascript, не могли бы вы поделиться ею со мной?

Спасибо


person Community    schedule 29.11.2008    source источник


Ответы (2)


Я думаю, вы запутались, потому что Javascript использует статическую область видимости, но на уровне функций, а не на уровне блоков, как в обычных структурированных языках.

var foo = "old";
if (true) {var foo = "new";}
alert (foo == "new")

Так что будьте осторожны, блоки не расширяют возможности! Вот почему вы иногда видите циклы с функциями внутри только для включения переменных, область действия которых находится внутри итерации:

functions = [];
for(var i=0; i<10; i++) {
   (function(){
       var local_i = i;
       functions[local_i] = function() {return local_i;}
   })();
}
functions[2]() // returns 2 and not 10
person Community    schedule 29.11.2008

Насколько я понял; Javascript имеет два типа переменных: глобальные и локальные переменные. Но предположим, что у нас есть переменная с именем x, которая определена как глобальная и определена в статической родительской области видимости места, где x упоминается. В этом случае x принимает значение глобальной переменной. Таким образом, глобальная переменная имеет более высокий приоритет, чем локальная. И, когда нет никаких глобальных переменных, x находит объявление через статическую цепочку, что заставляет меня думать, что Javascirpt является языком со статической областью видимости.

Я прав выше?

person Community    schedule 30.11.2008