Без пуризмов, я думаю, что лучший способ эмулировать скалярный аргумент по ссылке в Javascript использует объект, как говорит предыдущий ответ.
Однако я немного по-другому:
Я сделал вызов объекта внутри вызова функции, поэтому можно увидеть опорные параметры рядом с вызовом функции. Это увеличивает читаемость исходного кода
В объявлении функции я поместил свойства как комментарий по той же причине: читаемость.
var r;
funcWithRefScalars(r = {amount:200, message:null} );
console.log(r.amount + " - " + r.message);
function funcWithRefScalars(o) { // o(amount, message)
o.amount *= 1.2;
o.message = "20% increase";
}
В приведенном выше примере null
указывает явно выходной опорный параметр.
Выход:
240 - 20% Increase
На стороне клиента console.log
следует заменить на alert
.
★ ★ ★
Другой способ, который может быть еще более читабельным:
var amount, message;
funcWithRefScalars(amount = [200], message = [null] );
console.log(amount[0] + " - " + message[0]);
function funcWithRefScalars(amount, message) { // o(amount, message)
amount[0] *= 1.2;
message[0] = "20% increase";
}
Здесь вам даже не нужно создавать новые имена фиктивных имен, например r
выше.
Вместо использования track[$index].value
вы должны использовать step
, а также отслеживать ngRepeat по $index
var app = angular.module("app", []);
app.controller("MainCtrl", function($scope) {
$scope.noteMatrix = [
[false, false, false],
[false, true, false],
[false, false, false]
];
});
<html ng-app="app">
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
</head>
<body ng-controller="MainCtrl">
{{noteMatrix}}
<table>
<tbody>
<tr ng-repeat="track in noteMatrix track by $index">
<td>-{{$index}}-</td>
{{track}}
<td ng-repeat="step in track track by $index">
<input type="checkbox" ng-model="step"> {{step}}
</td>
</tr>
</tbody>
</table>
</body>
</html>
[1110 ]