变量值已添加但数组不会被推送

时间:2015-10-18 06:12:48

标签: javascript arrays

为什么值会被添加但数组不会被推送?

我想,如果我在功能之后添加window.load它就可以了。我得到它,当它最初解析时,函数不运行但是,这种情况我在窗口加载后很快调用该函数。

无论如何,为什么变量得到的值而不是数组?我真的以愚蠢的方式使用window.load吗?在这里学习。

window.load = foo(); //works if I declare this after the function

var barr = [],
    max, min;

function foo() {
    var a = 10,
        b = 30;

    barr.push("asfd");
    min = Math.min(a, b);
    max = Math.max(a, b);
    console.log(barr); // IDK what does this log, DevTool just throws error straight away
};

console.log(barr); // logs empty array [] as initially declared
console.log(min); // logs 10 on global scope
console.log(max); // logs 30 on global scope

1 个答案:

答案 0 :(得分:3)

window.onload = foo();更改为

window.onload = foo;

通过使用foo(),此处将立即调用该函数并将返回的值分配给onload回调。因此,在声明任何变量foo之前,会调用它。当您使用fooonload事件分配函数时,会传递foo的函数引用。

此外,我建议您使用DOMContentLoaded事件代替onload,因为onload将在页面上的所有资源完全加载时触发,这将花费太长时间。

在引用函数之前定义函数被认为是一种很好的做法。随着函数声明(function fnName())被提升到顶部,它将起作用。但是如果使用函数表达式语法(var fnName = function() {...)创建函数,则会抛出错误。

var barr = [],
  max, min;

function foo() {
  var a = 10,
    b = 30;

  barr.push("asfd");
  min = Math.min(a, b);
  max = Math.max(a, b);
  console.log(barr); // ["asfd"]
};

window.onload = foo;
// document.addEventListener('DOMContentLoaded', foo, false);

console.log(barr); // logs empty array [] as initially declared
console.log(min); // logs undefined
console.log(max); // logs undefined

此处需要注意的另一件事是变量minmax将为undefined,因为它们未分配值。如果在执行foo后记录它们,它们将记录正确的值。