试图理解js中与window.onload相关的一些代码

时间:2013-07-01 03:23:37

标签: javascript

<body>  
<script language="javascript">
window.tdiff = []; fred = function(a,b){return a-b;};
window.onload = function(e){ 
    console.log("window.onload", e, Date.now() ,window.tdiff, 
    (window.tdiff[1] = Date.now()) && window.tdiff.reduce(fred) ); 
}
</script> 
</body> 

以上代码来自网站。

在firefox-&gt;控制台中,它显示:

window.onload load 1372646227664 [undefined, 1372646227664] 1372646227664

问题:

  1. 对于window.tdiff->[undefined, 1372646227664],为什么不:[],因为当运行代码:window.tdiff时,它仍然是一个空数组?

  2. 对于window.tdiff.reduce(fred)->1372646227664window.tdiff = [undefined, 1372646227664]undefined - 1372646227664,应为NaN,为何显示1372646227664

4 个答案:

答案 0 :(得分:1)

  

对于window.tdiff-&gt; [undefined,1372646227664],为什么不:[],因为当   运行代码:window.tdiff,它仍然是一个空数组?

当你说代码时,它不是一个空数组:window.tdiff你指的是它作为参数传递给方法的点,但是当console.log函数评估你传入的值时,它的不再是一个空数组,因为它已被下一个参数填充。

> (window.tdiff[1] = Date.now()) && window.tdiff.reduce(fred) )

正如Arun P Johny在其他答案中指出的那样,reduce不会对未定义元素应用fred(),这就是为什么你没有得到NaN

答案 1 :(得分:0)

  1. 因为数组是一个复杂的javascript类型,并且它的值是通过引用传递的,所以你在控制台中有一个[],但是在 window.tdiff [1] = Date.now()您的空数组将替换为新值。如果你将使用window.tdiff.slice(),你将在控制台中获得一个空数组(因为slice创建一个新的数组副本,带有一个新的引用)
  2. 减少回调,而不是使用未定义(非引入或未启动)值运行。在你的情况下,reduce只返回第二个值。要查看其工作原理,请使用此链接https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
  3. 来使用MDN Reduce Compatibility部分

    P.S。如果您将console.log添加到fred,那么您将不会调用

答案 2 :(得分:0)

  1. 在调用diff之前,它会填充console.log数组的第二个元素。
  2. 来自文档的
  3. reduce对数组中存在的每个元素执行一次回调函数,不包括数组中的空洞(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

答案 3 :(得分:0)

从文档reduce中排除了数组中的漏洞,并且因为您的数组只有一个元素,所以它将作为reduce的结果返回