Замыкания в javascript, почему не работает?

274
26 мая 2017, 14:25

почему в ниже лежащей функции конечное значение переменной равно первоначальному? Хотя во внутренней функции данной переменной присвоено другое значение посредством замыкания? Как сделать, что бы сохранялось новое значение?

function s(){
  var a = 1;
  function d(c){
    console.log(c);
    c = 2;
    console.log(c);
  }
  d(a)
  console.log(a)
}

вывод в консоль: s() 1 2 1

Answer 1

Потому что примитивные значения (строки, числа, булевы значения, null/undefined) передаются в качестве аргументов по значению, а не по ссылке. Т.е. грубо говоря ваш аргумент c - это не ссылка на переменную а, это новая переменная c, со значением которое вы туда передали. Если сделать объект, то он будет передаваться по ссылке -

function s(){ 
  var a = {b:1}; 
  function d(c){ 
    console.log(c.b); 
    c.b = 2; 
    console.log(c.b); 
  } 
  d(a); 
  console.log(a.b) 
} 
 
s();

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

function s(){ 
  var a = 1; 
  function d(){ 
    console.log(a); 
    a = 2; 
    console.log(a); 
  } 
  d(a); 
  console.log(a) 
} 
s();

Замыкание — это особый вид функции. Она определена в теле другой функции и создаётся каждый раз во время её выполнения. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции.

(с) Википедия

READ ALSO
Node.js кириллица

Node.js кириллица

Изучаю Nodejs По учебнику предложили сделать простой консольный переводчик

413
ios, изменение css при повороте экрана

ios, изменение css при повороте экрана

Всем добрый день, при загрузке страницы $(window)load и изменении размера окна браузера $(window)

254
Не получается передать массив данных (из базы данных) методом ajax

Не получается передать массив данных (из базы данных) методом ajax

В require_once "blocks/headphp" находится подключение jquery + функция connect():

227