在函数中使用全局变量的副本

时间:2016-06-02 07:24:58

标签: javascript function global-variables local-variables

考虑我有一个名为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

也是如此

2 个答案:

答案 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的新副本,无需修改原始数组即可对其进行修改。

演示:https://jsfiddle.net/kx7f766w/1/

答案 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);

本地范围变量不会泄漏回全局变量。