Являются ли переменные статически или динамически & ldquo; scoped & rdquo; в JavaScript?

Вы можете найти ответ, который вы хотите найти в cppreference .

При использовании сразу после ввода с разделителями-пробелами, например. после int n; std::cin >> n;, getline потребляет символ конца, оставленный на входном потоке оператором >>, и немедленно возвращается. Общее решение состоит в том, чтобы игнорировать все оставшиеся символы в строке ввода с cin.ignore(std::numeric_limits::max(), '\n'); перед переключением на линейно-ориентированный вход.

blockquote>

30
задан kylex 6 June 2009 в 04:26
поделиться

4 ответа

Джефф прав. Обратите внимание, что на самом деле это не лучший тест статической области видимости (которая есть в JS). Лучше было бы:

myVar=0;

function runMe(){
    var myVar = 10;
    callMe();
}

function callMe(){
   addMe = myVar+10;
}

runMe();
alert(addMe);
alert(myVar);

В языке со статической областью видимости (например, JS), который предупреждает 10 и 0. var myVar (локальная переменная) в runMe затеняет глобальную переменную myVar в этой функции. Однако это не влияет на callMe, поэтому callMe использует глобальную переменную myVar, которая все еще имеет значение 0.

В языке с динамической областью видимости ( в отличие от JS) callMe наследует область видимости от runMe, поэтому addMe будет становится 20. Обратите внимание, что myVar все равно будет иметь значение 0 в предупреждении, потому что предупреждение не наследует область действия ни от одной из функций.

49
ответ дан 27 November 2019 в 22:13
поделиться

, если ваша следующая строка - callMe (); , тогда addMe будет 10, а myVar будет 0.

если ваша следующая строка - runMe (); , тогда addMe будет 20, а myVar будет 10.

Простите за вопрос - какое отношение это имеет к static / динамическое связывание? Разве myVar не просто глобальная переменная, и не будет ли процедурный код (развернуть все в стек вызовов) определять значения?

5
ответ дан 27 November 2019 в 22:13
поделиться

Переменные имеют статическую область видимости в JavaScript (динамическая область видимости - действительно довольно запутанный бизнес: вы можете прочитать об этом в Википедии ).

Однако в вашем случае, вы используете глобальную переменную, поэтому все функции будут обращаться к этой же переменной. Ответ Мэтью Флашена показывает, как вы можете изменить его, чтобы вторая переменная myVar на самом деле была другой переменной.

Эта страница объясняет, как объявлять глобальные и локальные переменные в JavaScript, если вы не слишком знакомы с этим. Это отличается от того, как это делают большинство языков сценариев. (В итоге: ключевое слово "var" делает переменную локальной, если она объявлена ​​внутри функции, в противном случае переменная является глобальной.)

3
ответ дан 27 November 2019 в 22:13
поделиться

Насколько я понимаю, любая переменная без var ключевое слово обрабатывается global , вместе с ним, его локальная область видимости, поэтому:

// This is a local scoped variable.
var local_var = "something"; 

// This is a global scoped variable.
global_var = "something_else";

В качестве хорошей практики JS рекомендуется ВСЕГДА добавлять ключевое слово var .

0
ответ дан 27 November 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: