考虑我有一个名为generatedPattern
的全局变量。我想在function animate()
中使用它,但不想更改其值。所以我将generatedPattern复制到函数中的局部var(比如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
也是如此答案 0 :(得分:2)
如果您在其他地方使用和更改float
,那么它会被更改。
如果你想在另一个函数中使用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
的新副本,无需修改原始数组即可对其进行修改。
答案 1 :(得分:0)
只需将全局变量分配给较低范围内的新变量:
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);
本地范围变量不会泄漏回全局变量。