Задать вопрос
r45her
@r45her
HTML-верстальщик / Frontend разработчик

Объявится ли переменная внутри функции, если её имя совпадает с параметром?

Есть два примера:

function trololo(param) {
	console.log(variable);
	var variable = 5;
	console.log(variable);
}
trololo(10);

Выведет undefined, затем 5.

function trololo(param) {
	console.log(param);
	var param = 5;
	console.log(param);
}
trololo(10);

Выведет 10, затем 5.

Вопрос. Что в этих двух примерах на самом деле происходит?

Понятно, что интерпретатор JS сначала объявляет все переменные и функции, а уже на втором заходе присваивает переменным значения и исполняет код. Поэтому в первом примере на момент первого console.log переменная variable уже существовала, но её значение было undefined.

Но что происходит во втором примере?

У меня есть два предположения:
  1. Объявление переменной при помощи ключевого слова var опускается, т.к. интерпретатор видит параметр с таким же именем. Поэтому значение 5 присваивается параметру, перезаписывая значение 10. В обоих console.log выводится значение ПАРАМЕТРА, а не ПЕРЕМЕННОЙ.
  2. Переменная всё-таки объявляется, перезаписывая параметр. Первый console.log выводит ПАРАМЕТР, а второй уже ПЕРЕМЕННУЮ.


Где правда?
  • Вопрос задан
  • 1237 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 1
flapflapjack
@flapflapjack
на треть я прав
Они выполняются в хронологическом порядке, как объявил - так и происходит. При перезаписи - перезаписываются.

func(param) - здесь происходит var param
{

var param = 1; - здесь переназначение
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
На самом деле вместо
function trololo(param) {
  console.log(variable);
  var variable = 5;
  console.log(variable);
}
trololo(10);

Получается как-то так:
function trololo(param) {
  var variable; // undefined
  console.log(variable);
  variable = 5;
  console.log(variable);
}
trololo(10);


То есть все объявления с var выносятся в начало функции движком js. Называется это hoisting.
Ответ написан
@MitakoHir
Для проверки можно использовать массивоподобный объект arguments

function trololo(param) {
console.log(arguments);
console.log(param);
var param = 5;
console.log(param);
console.log(arguments);
}
trololo(10);

Из вывода видно что значение в arguments изменяется, значит можно сказать что объявление переменной опускается и происходит перезапись.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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