2015-10-18 53 views
2

为什么值被添加,但数组不被推送?增加了可变值,但数组未被推送

我想,如果我在功能后加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 

回答

3

更改window.onload = foo();

window.onload = foo; 

通过使用foo()这里会立即调用函数返回值分配给onload回调。因此,在声明任何变量foo之前被调用。当您使用foo将函数分配给onload事件时,将传递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


一两件事,这里要注意的是,变量minmaxundefined,因为它们没有分配的值。如果在执行foo之后记录它们,它们将记录正确的值。

+1

此外事件处理程序是window.onload不是window.load –

+0

谢谢,但你尝试运行你的代码?我做了,数组仍然没有推动。我曾经得到最小值和最大值,但barr未定义为'window.onload',但无法再次重现。 我明白了关于最小和最大的观点,但是阵列应该被推向正确? –

+0

@СхирисхШреста请读回答的最后一句 – Tushar