JavaScript, почему бы не удалить ключевое слово var? - PullRequest
4 голосов
/ 20 марта 2011

почти во всех книгах по JavaScript сказано, что

всегда используют ключевое слово var при объявлении переменных, потому что без var переменная будет объявлена ​​как глобальная переменная.

затемпочему бы не удалить ключевое слово var, сделать объявление по умолчанию в качестве локальной области видимости?подобно Python, если вы хотите использовать глобальные переменные, вы пишете:

global foo;

мы используем локальные переменные почти все время, не так ли?есть веская причина?Спасибо за любую помощь.


edit: Спасибо за вашу помощь, я подумал, что должна быть веская причина, показывающая, что использование var лучше, поэтому я не пытался изменить язык, как это было,

Ответы [ 5 ]

6 голосов
/ 20 марта 2011
var globalInt = 5;

function Hello()
{
    // Hey, give me back my var keyword!
    // I want to assign a global existing variable
    globalInt = 7; 
}

Еще один момент: нет простого способа удалить что-то из JavaScript.Каждая функция (даже взломанная) уже используется на тысячах сайтов, и удаление функций нарушит эти сайты.JavaScript может быть только расширен.Или следует создать новый JS, который будет несовместим с предыдущими версиями.

4 голосов
/ 20 марта 2011
function A() {
    var foo; // variable in the scope of function A
    function B() {
        foo; // variable still in the scope of function A
    }
} 

Если бы выбор был «Узкая область» или «Глобальная область», то это было бы невозможно.

3 голосов
/ 20 марта 2011

Это просто способ, которым был разработан язык. Если переменная распределяется автоматически, она размещается в глобальной области видимости.

Это имеет большой смысл, если вы думаете об этом. В какой области видна переменная? Компилятор не может знать цель программиста с помощью явного объявления

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

1 голос
/ 20 марта 2011

ОК, я попытаюсь объяснить, как это работает снова.Существует объект Global ECMAScript, который является «корнем» всего остального.В браузерах window объект реализует Global.Итак:

function assert( condition, message ) {
  if ( !condition ) 
      if ( typeof message != 'undefined' ) alert( message ); 
      else alert( 'Free Consulting just talks rubbish' );
}

// assuming global scope
assert( this == window, 'noes!' ); // and Global context

var spam = 'for all you python lovers'; // becomes a property of Global
assert( spam == window.spam, 'there not much spam in it' ); // same

function eggs () { // becomes a method of Global actually
  assert( spam == window.spam, 'shut up!' ); // unqualified spam available here through closure
  assert( arguments.callee == window.eggs ); // and again
}
eggs();

Миссис Заключение : JavaScript - это отдельный язык со своими специфическими чертами, поэтому не применяйте другие знания языка к JS (это делает Дугласа Крокфорда грустной пандой:)

1 голос
/ 20 марта 2011

Использование ключевого слова var внутри функции объявляет переменную в локальной области видимости, что предотвращает перезапись любой глобальной переменной. Идея состоит в том, чтобы играть безопасно и использовать вар. Если вы знаете, что делаете (на 100% уверены, что не будете перезаписывать ни одну глобальную переменную), не стесняйтесь отбрасывать var.

...