在函数中使用全局变量的副本
Using copies of global variables in functions
假设我有一个名为 generatedPattern
的全局变量。我想在 function animate()
中使用它,但不想更改它的值。所以我将 generatedPattern 复制到函数中的本地变量(比如 var patternToAnimate
),然后使用 patternToAnimate.
对 patternToAnimate 的任何更改都会更改 generatedPattern 吗?如果是这样,我该如何避免这种情况?
即,如何在函数中局部使用 generatedPattern 而不全局更改它?
代码
function animateGeneratedPattern() {
var patternToAnimate = generatedPattern;
function animateNextPattern(lightup) {
if (!patternToAnimate|| patternToAnimate.length === 0) {
return;
}
switch(patternToAnimate[0]) {
case 1:
animateRed();
break;
case 2:
animateGreen();
break;
case 3:
animateBlue();
break;
case 4:
animateYellow();
break;
}
if (lightup) {
// Long delay before turning light off
setTimeout(function() {
animateNextPattern(false);
}, 500);
}
else {
patternToAnimate.splice(0, 1);
// Small delay before turning on next light
setTimeout(function() {
animateNextPattern(true);
}, 10);
}
}
animateNextPattern(true);
}
当 patternToAnimate 被拼接时,generatedPattern 也被拼接。
只需将全局变量分配给较低范围内的新变量:
console.clear();
console.log('no problem')
var global = 123;
(function () {
var local = global;
local = 321;
console.log("local is",local);
})();
console.log("global is",global);
console.log('Actually change the global variable')
global = 123;
(function () {
global = 321;
})();
console.log("global is",global);
局部范围变量不会泄漏回您的全局变量。
如果您在其他地方使用和更改 generatedPattern
,那么它会被更改。
如果你想在另一个函数中使用genratedPattern
的值而不修改它,你确实必须复制它。但注意,不要将其保存为参考:
var generatedPattern = [1, 2, 3];
var patternToAnimate = generatedPattern;
这里,patternToAnimate
是对generatedPattern
的引用。因此,当您修改 patternToAnimate
时,generatedPattern
也会被修改。因为它们实际上是相同的数组。
如果要将一个数组复制到另一个数组,请使用 slice
var generatedPattern = [1, 2, 3];
var patternToAnimate = generatedPattern.slice();
现在 patternToAnimate
是 generatedPattern
的新副本,可以在不修改原始数组的情况下对其进行修改。
假设我有一个名为 generatedPattern
的全局变量。我想在 function animate()
中使用它,但不想更改它的值。所以我将 generatedPattern 复制到函数中的本地变量(比如 var patternToAnimate
),然后使用 patternToAnimate.
对 patternToAnimate 的任何更改都会更改 generatedPattern 吗?如果是这样,我该如何避免这种情况?
即,如何在函数中局部使用 generatedPattern 而不全局更改它?
代码
function animateGeneratedPattern() {
var patternToAnimate = generatedPattern;
function animateNextPattern(lightup) {
if (!patternToAnimate|| patternToAnimate.length === 0) {
return;
}
switch(patternToAnimate[0]) {
case 1:
animateRed();
break;
case 2:
animateGreen();
break;
case 3:
animateBlue();
break;
case 4:
animateYellow();
break;
}
if (lightup) {
// Long delay before turning light off
setTimeout(function() {
animateNextPattern(false);
}, 500);
}
else {
patternToAnimate.splice(0, 1);
// Small delay before turning on next light
setTimeout(function() {
animateNextPattern(true);
}, 10);
}
}
animateNextPattern(true);
}
当 patternToAnimate 被拼接时,generatedPattern 也被拼接。
只需将全局变量分配给较低范围内的新变量:
console.clear();
console.log('no problem')
var global = 123;
(function () {
var local = global;
local = 321;
console.log("local is",local);
})();
console.log("global is",global);
console.log('Actually change the global variable')
global = 123;
(function () {
global = 321;
})();
console.log("global is",global);
局部范围变量不会泄漏回您的全局变量。
如果您在其他地方使用和更改 generatedPattern
,那么它会被更改。
如果你想在另一个函数中使用genratedPattern
的值而不修改它,你确实必须复制它。但注意,不要将其保存为参考:
var generatedPattern = [1, 2, 3];
var patternToAnimate = generatedPattern;
这里,patternToAnimate
是对generatedPattern
的引用。因此,当您修改 patternToAnimate
时,generatedPattern
也会被修改。因为它们实际上是相同的数组。
如果要将一个数组复制到另一个数组,请使用 slice
var generatedPattern = [1, 2, 3];
var patternToAnimate = generatedPattern.slice();
现在 patternToAnimate
是 generatedPattern
的新副本,可以在不修改原始数组的情况下对其进行修改。