代码之家  ›  专栏  ›  技术社区  ›  j.doe BudgieInWA

如果不使用,则无法将值分配给全局数组。推送()

  •  2
  • j.doe BudgieInWA  · 技术社区  · 7 年前

    由于某些原因,如果不使用 .push() .

    (function() {
        var globalEmail = [];
    
        var testClear = function() {
            var arr = [1, 2, 3];
    
            if (globalEmail.length > 1) {
                globalEmail = [];
            }
            else {
                globalEmail = arr;
            }
        };
    
        window.globalEmail = globalEmail;
        window.testClear = testClear;
    })();
    

    如果我打电话 testClear() 然后 globalEmail 在控制台中, 全球邮件 保持不变。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Nina Scholz    7 年前

    对于空数组,可以将长度设置为零,对于赋值,可以使用 Array#push 具有 spread syntax ...

    var globalEmail = [],
        testClear = function() {
            var arr = [1, 2, 3];
    
            if (globalEmail.length > 1) {
                globalEmail.length = 0;
            } else {
                globalEmail.push(...arr);
            }
        };
    
    testClear();
    console.log(globalEmail);
    
    testClear();
    console.log(globalEmail);
        2
  •  1
  •   kLabz    7 年前

    正如评论中所说,您在这里失去了引用,因为您分配了 globalEmail 到新阵列,所以窗口。globalEmail与新的globalEmail数组不同。

    您需要就地修改阵列(使用 splice concat ,例如)。

        3
  •  0
  •   Alexis Wilke    7 年前

    您希望将globalEmail变量定义为全局变量,而不是本地变量。

    (function() {
        window.globalEmail = []; // this goes here
    
        var testClear = function() {
            var arr = [1, 2, 3];
    
            if (window.globalEmail.length > 1) {
                window.globalEmail = [];
            }
            else {
                window.globalEmail = arr;
            }
        };
    
        //window.globalEmail = globalEmail; <-- not here
        window.testClear = testClear;
    })();
    

    这个 window. 不是绝对必需的,但 var globalEmail; 在函数中定义一个局部变量,这不是您首先想要的。

    虽然,如果 testClear() 如果要清除任何数组,则无法正确实现。相反,它应该接受一个参数,然后处理该参数。

    function testClear(a)
    {
        var arr = [1, 2, 3];
    
        if(a.length > 1) {
            a.splice(0);
        }
        else {
            a.splice(0);
            a.push.apply(a, arr);
        }
    }
    
    testClear(window.globalEmail);
    

    然后 testClear() 我认为函数更有意义。

    请注意,存在以下缺点 a.push.apply() 在大型阵列上中断。请参见此处 How to extend an existing JavaScript array with another array, without creating a new array? 有关详细信息。