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

Известно, что в Javascript параметры функции передаются только по значению, нельзя передать параметр простого типа по ссылке.

О чем это мы? В программировании существует два способа передачи параметров функции: по ссылке и по значению. Когда параметр передается по значению, то функция только использует это значение, значение фактической переменной изменить она не в силах, даже если в функции переменной присваивается новое значение, как только функция закончит работу, значение нашей переменной станет прежним, каким оно было до работы функции. Когда параметр передается по ссылке, то изменение значения переменной внутри функции происходит реально и на выходе из функции наша переменная уже имеет новое значение. Это очень нужная штука, а в Javascript она не работает. 

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

В моей таблице стилей CSS задано 2 объекта. Объект с id="d1" имеет ширину 150 px, объект с id="d2" имеет ширину 200 px:

#d1 { width: 150px; }
#d2 { width: 200px; }

В HTML-коде заданы оба объекта (я не привожу этот фрагмент за его несущественностью) и два вызова функции. При первом вызове функция processDecreaseWidth будет изменять значение атрибута width для первого объекта, при следующем вызове функция будет изменять значение атрибута width для второго объекта. Функция processDecreaseWidth имеет два входных параметра. Первый параметр - это id, по которому определяется, с каким объектом работать. Второй параметр - соответствует изменяемой переменной, отвечающей за ширину объекта.

Привожу фрагменты вызова функций:

"javascript:processDecreaseWidth('d1',thisWidthD1)"

"javascript:processDecreaseWidth('d2',thisWidthD2)"

В сценарии на Javascript сначала задаются интересующие нас переменные. Им присваиваются начальные значения ширины объектов, те же, что и в таблице стилей CSS:

var thisWidthD1=150;

thisWidthD2=200;

Затем следует код функции, где ElId - id объекта, thisWidth - ширина объекта. Сначала функция присваивает переменной thisWidth значение новой ширины, затем обрабатываемому объекту присваивается новая ширина:

function processDecreaseWidth(ElId,thisWidth)
{
    if (thisWidth > 2) 
    {
        thisWidth=thisWidth-2;
        document.getElementById(ElId).style.width=thisWidth+"px";
        reformWidth(ElId,thisWidth);
    }
}

Обратите внимание, в конце функции processDecreaseWidth вызывается функция reformWidth, которая присваивает переменным, отвечающим за ширину объекта, новые значения. Вот код этой функции:

function reformWidth(ElId,thisWidth)
{
    switch (ElId)
    {
        case "d1": thisWidthD1=thisWidth;
        break;
        case "d2": thisWidthD2=thisWidth;
        break;
    }
}

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

Добавить комментарий

Защитный код
Обновить

Комментарии  

Darin
0 # Darin 08.12.2024 06:30
I am really delighted to glance at this web site posts which includes plenty of helpful facts, thanks for providing such information.

Have a look aat my web site: YüKsek Kaliteli Pamuk IpliğI: https://www.turip.com.tr/
Ответить | Сообщить модератору
Carrie
0 # Carrie 08.12.2024 15:14
Hey There. I found your blog using msn. This is an extremely well written article.
I will be sure to bookmark it and return to read more of your useful information. Thanks for the post.
I will certainly comeback.

Feel free to surf to my blog; esans fiyatları: https://www.zemzemesans.com/
Ответить | Сообщить модератору
Norris
0 # Norris 09.12.2024 01:01
I simply couldn't depart your site prior to suggesting that I
extremely enjoyed the usual info a person supply to your guests?

Is gonna be back often to check out new posts

Also visit my web-site :: international pharmacy: https://disqus.com/home/forum/canadian-pharmaceuticals-online
Ответить | Сообщить модератору
Rex
0 # Rex 09.12.2024 16:35
Hey very nice blog!

Also visit my homepage: canadian pharmacies: https://pinshape.com/users/2653480-pharmacies-shipping-to-usa
Ответить | Сообщить модератору
Brett
0 # Brett 09.12.2024 19:11
Write more, thats all I have to say. Literally, it seems as though you relied
on the video to make your point. You definitely knoww what
youre talking about, why waste your intelligence on just posting videos to your site when you could bbe giving us something enlightening to read?


Feeel free to surf to my web site - Canlı maç bahisleri: https://ovisaff4.com/links/?btag=1097598
Ответить | Сообщить модератору
Roxanna
0 # Roxanna 10.12.2024 01:45
MBit Casino facilitates transactions through
a variety of cryptocurrencie s, including Bitcoin, Ethereum,
Litecoin, Dogecoin, and Tether, ensuring fast and secure banking.


Here is my website :: webpage: https://casinogrizzly.com/
Ответить | Сообщить модератору
Kit
0 # Kit 11.12.2024 07:27
Woah! I'm really digging the template/theme of this
website. It's simple, yet effective. A lot of times it's challenging to get that "perfect balance" between usability and visual appeal.
I must say you have done a fantastic job with this.
In addition, the blog loads super quick for me on Firefox.

Outstanding Blog!

Here is my web site canadian pharcharmy: https://kqwsh.wordpress.com/2022/05/16/what-everybody-else-does-when-it-comes-to-online-pharmacies/
Ответить | Сообщить модератору
Bailey
0 # Bailey 11.12.2024 20:25
Helpful information. Fortunate me I discovered your site unintentionally , and I am shocked why this coincidence did not took place in advance!
I bookmarked it.

Here is my web blog :: online medicine tablets shopping: https://www.divephotoguide.com/user/drugs
Ответить | Сообщить модератору
Luisa
0 # Luisa 11.12.2024 21:15
Thanks for sharing your thoughts on новости hi-tech наука техника технология компьютер программа космос транспорт
энергия армия устройство гаджет hard soft.

Regards

Feel free to visit my site: online medicine order
discount: https://www.mojomarketplace.com/user/discountcanadiandrugs-f0IpYCKav8
Ответить | Сообщить модератору