JavaScript: возможно ли для замыканий доступ к переменным во вложенной области видимости по значению, а не по ссылке, как в PHP?

Следующий код JavaScript демонстрирует, как
Функции JavaScript (замыкания) обращаются к переменным
в окружающей их среде посредством ссылки, а
чем по значению.

var sum; // global variable

function outer() {
var hundred_more = 100;
sum = function (a, b) {
return a + b + (++hundred_more);
};
sum2 = function (a, b) {
return a + b + (++hundred_more);
};
alert(hundred_more);
}
outer(); // define sum at the global scope and print 100
alert(sum(5, 10)); // 116
alert(sum(5, 10)); // 117
alert(sum2(5, 10)); // 118
alert(sum2(5, 10)); // 119
outer(); // redefine sum at the global scope and print 100
alert(sum(5, 10)); // 116
alert(sum(5, 10)); // 117
alert(sum2(5, 10)); // 118
alert(sum2(5, 10)); // 119

Тот же код в PHP выглядит следующим образом:

<?php

$sum = null; // global variable
$sum2 = null; // global variable

function outer() {
global $sum;
global $sum2;
$hundred_more = 100;
$sum = function ($a, $b) use (&$hundred_more) {
return $a + $b + (++$hundred_more);
};
$sum2 = function ($a, $b) use (&$hundred_more) {
return $a + $b + (++$hundred_more);
};
var_dump($hundred_more);
}
outer(); // define sum at the global scope and print 100
var_dump($sum(5, 10)); // 116
var_dump($sum(5, 10)); // 117
var_dump($sum2(5, 10)); // 118
var_dump($sum2(5, 10)); // 119
outer(); // redefine sum at the global scope and print 100
var_dump($sum(5, 10)); // 116
var_dump($sum(5, 10)); // 117
var_dump($sum2(5, 10)); // 118
var_dump($sum2(5, 10)); // 119

Чтобы передать переменную из окружающей среды по значению, а не по ссылке
в PHP вы просто опускаете амперсанд (&) перед переменными после ключевого слова use.
Это приводит к тому, что значение копируется в область закрытия функции во время
Функция определена так, что все var_dumps выводят значение 116. Возможно ли
каким-то образом достичь этой же конструкции в JavaScript (с переменными, передаваемыми в
внутреннее закрытие по значению, а не по ссылке)?

Благодарю.

1

Решение

Ну, вы могли бы создать другое закрытие для этого …

function outer() {
var hundred_more = 100;
sum = (function(hundred_more){
return function (a, b) {
return a + b + (++hundred_more);
};
})(hundred_more);
sum2 = (function(hundred_more){
return function (a, b) {
return a + b + (++hundred_more);
};
})(hundred_more);
alert(hundred_more);
}
outer(); // define sum at the global scope and print 100
alert(sum(5, 10)); // 116
alert(sum(5, 10)); // 117
alert(sum2(5, 10)); // 116
alert(sum2(5, 10)); // 117
outer(); // redefine sum at the global scope and print 100
alert(sum(5, 10)); // 116
alert(sum(5, 10)); // 117
alert(sum2(5, 10)); // 116
alert(sum2(5, 10)); // 117
1

Другие решения

Других решений пока нет …