Как обойти запрет изменения значений переменных, передаваемых функции по ссылке
- Подробности
- Категория: Программирование
- Просмотров: 3455
Известно, что в 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;
}
}
Недостаток этого способа в том, что при большом количестве объектов объем кода последней функции страшно разрастется, как впрочем и все фрагменты присвоения данных и задания объектов.
Комментарии
Have a look aat my web site: YüKsek Kaliteli Pamuk IpliğI: https://www.turip.com.tr/
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/
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
Also visit my homepage: canadian pharmacies: https://pinshape.com/users/2653480-pharmacies-shipping-to-usa
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
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/
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/
I bookmarked it.
Here is my web blog :: online medicine tablets shopping: https://www.divephotoguide.com/user/drugs
энергия армия устройство гаджет hard soft.
Regards
Feel free to visit my site: online medicine order
discount: https://www.mojomarketplace.com/user/discountcanadiandrugs-f0IpYCKav8