@r45her
HTML-верстальщик

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

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

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 выводит ПАРАМЕТР, а второй уже ПЕРЕМЕННУЮ.


Где правда?
  • Вопрос задан
  • 1189 просмотров
Решения вопроса 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 изменяется, значит можно сказать что объявление переменной опускается и происходит перезапись.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
RealtimeBoard Пермь
от 90 000 до 140 000 руб.
Smartbics Нижний Новгород
от 50 000 до 70 000 руб.
//stablecode Вена
от 110 000 до 140 000 руб.
20 февр. 2019, в 23:54
1000 руб./за проект
20 февр. 2019, в 23:26
25000 руб./за проект
20 февр. 2019, в 22:04
500 руб./за проект