JavaScript: значение параметра при повторном выполнении функции

326
21 февраля 2017, 19:34

По выполнении следующего кода, у нас в консоль выведется дважды true:

var booltestvar = true;
function testFunc1(){
   otherFunc(booltestvar)
}
function otherFunc(booltestvar){
  if (booltestvar === true){
    console.log("true")
    booltestvar = false;  
  }
  else {console.log("Уже не true")}
}
testFunc1();
testFunc1();

otherFunc в параметре не нуждается: booltestvar итак видна внутри неё, так как определена на внешнем уровне. Поэтому если мы уберём параметр из otherFunc, второй вывод в косоль будет Уже не true.

Правильно ли я понял, что значение параметра функции, если оно есть, не может быть изменено внутри самой функции и использовано при повторном вызове функции? В любом случае, прошу Вас прокомментировать результаты эксперимента.

Answer 1

booltestvar внутри функции

function otherFunc(booltestvar){ ... }

полностью перекрывает/прячет внешнюю переменную. В вашем случае, параметр передается в функцию по значению, его изменение внутри функции никак не влияет на значение переменной, которая была использована в вызове функции.

booltestvar внутри функции

function otherFunc(){ ... }

это внешняя переменная, любые изменения - это ее непосредственные изменения.

Называйте переменные по-разному, и будет Вам счастье.

Answer 2

Если вопрос в изменении значения переменной Вы можете воспользоватся тем, что любая функция в данном примере вызывается в контексте window. А так как booltestvar ноходится так же в том же контексте можно сделать так.

var booltestvar = true; 
 
function testFunc1(){ 
   otherFunc(booltestvar) 
} 
 
function otherFunc(booltestvar){ 
  if (booltestvar === true){ 
    console.log("true") 
    this.booltestvar = false;   
  } 
  else {console.log("Уже не true")} 
} 
 
testFunc1(); 
testFunc1();

Но в любом случае, все таки не называть переменные и название параметров одинаково

READ ALSO
Отправка email без перезагрузки

Отправка email без перезагрузки

Добрый деньТема уже избитая, но я все равно туплю

407
Установка целей в Яндекс.Метрике на блок “Поделиться”

Установка целей в Яндекс.Метрике на блок “Поделиться”

На сайте установлен блок "Поделиться" от ЯндексаХочу отслеживать в Яндекс

439
Почему функция tableRender() возвращает undefined?

Почему функция tableRender() возвращает undefined?

Есть публичный метод tableRender(arr), он получает на вход массив значений товаров и рендерит по нему таблицуВообще функция tableRender() ничего не возвращает,...

430
Проверка ссылки на наличие якоря

Проверка ссылки на наличие якоря

Здравствуйте, подскажите пожалуйста, как сделать проверку ссылки на наличие якоря с прокруткой к блоку ?

376