Почему глобальная переменная не изменяется при определенных обстоятельствах в функции, если вы не объявляете ее с помощью var или это не аргумент?

#javascript

#javascript

Вопрос:

ECMAScript довольно прост в var . Если вы не используете var внутри функции для объявления переменной, которой вы присваиваете, вы присваиваете глобальную область видимости. Это происходит из-за способа определения области видимости цепочки. Исполняющая среда ищет идентификатор в локальной области видимости, а затем перемещается вверх, пока он не достигнет глобальной области видимости. Если не найдено объявления для идентификатора the и он не идентифицирован как аргумент, переменная создается в глобальной области видимости.

Например, локальной областью видимости:

 var car = 'Blue';

function change_color () {
  var car = 'Red';
} 
change_color();
console.log(car); //logs 'Blue' as car is in the local scope of the function.
  

Когда car не найдено в локальной области видимости:

 var car = 'Blue';
function change_color () {
  car = 'Red';
}
change_color();
console.log(car); 
//logs 'Red' as car is not in the local scope and the global variable is used.
  

Теперь, по-видимому, есть исключение из этого правила, о котором я не знал и не понимаю (обратите внимание на название функции):

 var car = 'Blue';
(function car () {
 car = 'Red';
})();
console.log(car); //Logs 'Blue'????
  

Кто-нибудь может объяснить это, пожалуйста? Я не вижу, где это объясняется в ECMASpec. Протестировано в Chrome 8 и Firefox 3.6

Ответ №1:

Именованное функциональное выражение (в отличие от объявления функции) создает имя, которое доступно только в пределах области действия функции.

Выражение (не объявление) формы (function foo() { ... }) создает идентификатор с именем foo , который существует только внутри функции.
Поэтому, когда вы присваиваете foo внутри функции, вы присваиваете этому локальному идентификатору.

Если вы измените свою функцию на объявление функции, она будет работать так, как вы ожидаете:

 var car = 'Blue';
function car () {
    car = 'Red';
}
car();
console.log(car); //Logs 'Red'
  

Комментарии:

1. Сегодня я узнал еще одну вещь о JavaScript. Спасибо.

2. Это объявление функции, а не оператор function. В остальном, хороший ответ.