【问题标题】:Javascript strange loading sequenceJavascript奇怪的加载顺序
【发布时间】:2014-06-28 12:59:17
【问题描述】:

在下面的代码中,我希望看到以下序列

1, 2, loaded 

但我明白了

1, loaded, 2

为什么?

<html>
<script>
window.onload = function()
{
    alert('loaded');
}

(function ()
{
    alert('1');
}());

(function ()
{
    alert('2');
}());

</script>
<body>
</body>
</html>

【问题讨论】:

  • console.log 也会发生这种情况,而不是阻止 alert:jsfiddle.net/9fSgE
  • @HalimQarroum 有什么区别?这只是您编写它的方式,并且在其上下文 ()); 中执行函数 () 更有意义,并且在我们同意使用正确标点符号的任何语言中,在 JS 中执行相同操作是有意义的。 lost curl 也一样,最好在声明函数的同一行中使用它。
  • @FelixKling 是的,我也认为这与alert()blocking 有关,似乎并非如此。将电话放在head&lt;/body&gt; 之前都没有区别
  • 玩了一下:如果你在 IIFE 之间添加直接的console.log 调用,你可以看到loaded 在第一个 IIFE 终止后被直接调用:jsfiddle.net/9fSgE/1。但是,如果您打开第一个 IIFE,那么 loaded 调用会出现在最后,而不是在第二个 IIFE 之后:jsfiddle.net/9fSgE/2。不幸的是,这并没有让我更接近解释:-/
  • +1 有趣的问题。不能等待一个体面的解释。最好更新到console.log 版本,因为这对我来说真的很神秘,而alert 似乎更有意义。

标签: javascript


【解决方案1】:

在窗口onload 函数表达式之后忘记了;。于是就变成了:

window.onload = function () {
    console.log('loaded');
}(function() { console.log('1'); }())

所以onload 函数会立即使用一个参数执行,这是另一个 IEFE 的结果。因此

function() { console.log('1'); }()

首先执行,然后立即执行 window.onload 函数表达式。然后console.log('2') 表达式。

很好的例子说明为什么不要忘记行尾的分号。

【讨论】:

  • 我还要补充一点,出于完全相同的原因,许多库、插件等都希望是防弹的,并且是由他们自己立即调用的函数表达式 (function(){}()); 他们有一个; 作为前缀,例如:;(function(){}()); 以防止被草率的代码破坏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多