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

狮子座

考虑一下我有一个名为的全局变量generatedPattern我想在中使用它function animate(),但不想更改其值。因此,我将generatePattern复制到var patternToAnimate函数中的本地var(say )中,然后使用patternToAnimate。

对patternToAnimate的任何更改会更改generatePattern吗?如果是这样,如何避免这种情况?

即,如何在不全局更改的情况下在本地函数中使用generatePattern?

代码

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被拼接时,generatePattern也将被拼接。

皮莫尔

如果您在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,可以在不修改原始数组的情况下对其副本进行修改。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章