【问题标题】:Using copies of global variables in functions在函数中使用全局变量的副本
【发布时间】:2016-06-02 07:24:58
【问题描述】:

假设我有一个名为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 也是如此。

【问题讨论】:

  • 这取决于generatedPattern 是否是原始值。
  • 全局定义为 var generatedPattern=[];

标签: javascript function global-variables local-variables


【解决方案1】:

如果您在其他地方使用和更改generatedPattern,那么它会被更改。

如果你想在另一个函数中使用genratedPattern 的值而不修改它,你确实必须复制它。但请注意,不要将其保存为参考:

var generatedPattern = [1, 2, 3];
var patternToAnimate = generatedPattern;

这里,patternToAnimate 是对generatedPattern 的引用。因此,当您修改 patternToAnimate 时,generatedPattern 也会被修改。因为它们实际上是相同的数组。

如果要将一个数组复制到另一个数组,请使用slice

var generatedPattern = [1, 2, 3];
var patternToAnimate = generatedPattern.slice();

现在patternToAnimategeneratedPattern 的新副本,可以在不修改原始数组的情况下进行修改。

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

【讨论】:

  • 所以如果我在函数内部执行var patternToAnimate=generatedPattern;,它们都引用同一个数组??
【解决方案2】:

只需将全局变量分配给较低范围内的新变量即可:

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

局部范围变量不会泄漏回您的全局变量。

【讨论】:

  • 我试过了,但是当我改变本地变量时,全局变量也会改变。
  • 请发布一个代码示例,以便我看看发生了什么
猜你喜欢
  • 2022-01-16
相关资源
最近更新 更多