2013-11-20 2 views
1
function foo(){ 
    var bar = 3 
    return bar; 
    var bar = 8 
} 
alert(foo()); //prints 3 

Выполнение чего-либо подобного в C++ приведет к ошибке. Каков был мотив принятия этого дизайнерского решения?Почему это переопределение переменных не является ошибкой в ​​JavaScript?

+1

-C++ тег, потому что это не вопрос на C++. То же самое происходит в Java или C#. –

+1

* «Каков был мотив принятия этого дизайнерского решения?» * Этот вопрос не может быть полезен, кроме как Бренданом Эйхом или кем-то, цитирующим что-то (с достоверной, проверяемой ссылкой), где Брендан Эйч объяснил, почему он это сделал. [Соответствующая часть спецификации] (http://www.ecma-international.org/ecma-262/5.1/#sec-10.5) ясно, что поведение определено, но не объясняет мотив. Мы все можем * спекулировать *, но спекуляция - это не то, для чего SO. –

+1

Кто знает почему? Все веб-технологии чрезмерно толерантны, потому что они должны справляться с большим количеством плохого программного обеспечения и глупых разработчиков. У вас также может быть два s в вашем HTML. Ни один браузер не будет жаловаться. –

ответ

1

Из-за того, как область видимости функции в JavaScript и грузоподъемных работ, что код в основном оценивается как:

function foo() { 
    var bar; 
    bar = 3; 
    return bar; 
    bar = 8; 
} 
alert(foo()); 

Все объявления переменных поднимаются до верхней части их объема, когда анализируется, а затем задания произойдет во время выполнения, так что, по существу, неважно, объявляете ли вы переменную несколько раз - среда выполнения не знает.

+3

Это не отвечает на вопрос, который * «Каков был мотив принятия такого решения?» * Подъем не имеет значения, нет причин, по которым вы не можете поднимать * и * не разрешать избыточные «var». –

+0

Я полагаю, что здесь упоминаются два проектных решения. A) Подъем и B) Тот факт, что переменные «повторного использования» не являются синтаксической ошибкой (которая была специально задана в вопросе). Похоже, что аргументация B заключается в A. Нет причин бросать синтаксическую ошибку, если объявления поднимаются вверху во время разбора. – sbking

+2

Возможно. Это, однако, не ответ на вопрос - или, по крайней мере, если это так, это спекулятивно. (На самом деле, можно было бы избежать справедливой горе, если бы это была ошибка.) –

-2

Любая программа в основном обрабатывается компьютером в три этапа:

  1. синтаксический, где источник был прочитан и преобразуется в AST. Если это невозможно, вы получите синтаксическую ошибку.

  2. компиляция, преобразование AST в исполняемое представление (машинный код, байт-код и т. Д.). При ошибке вы получаете ошибку компиляции.

  3. работает, возможно, получая некоторые ошибки во время выполнения.

языки «Static», как C++ или Java предназначены для повышения, как много ошибок, как это возможно на этапе 2. Программисты любят, что: каждый исправлена ​​ошибка компилятора означает меньше отладки позже.

Языки «Scripting», такие как Javascript, обычно не создают никаких ошибок времени компиляции. Каждая ошибка, которую вы получаете, - это либо синтаксис, либо ошибка времени выполнения. Поскольку объявления переменных обрабатываются компилятором, а не во время выполнения, было бы бессмысленно добавлять целый новый класс ошибок только для этого конкретного случая.

Смежные вопросы