2014-09-10 88 views
0

我知道函数表达式必须表达在顶部,如果你想使用它们而不是函数声明被悬挂在顶部。为什么window.onload允许我使用函数作为函数表达式使用?

当我使用window.onload调用我的构造函数时,它可以工作。但是,如果我没有window.onload,并且在我的函数表达式之前调用我的构造函数,代码会中断。

<script type="text/javascript"> 

     window.onload = function() { 
      var c = new C(); 
     } // this works, but if i delete window.onload the code breaks. 

     var C = function() { 
      console.log("test"); 

     }; 

</script> 
+1

'var C' *声明*仍然悬而未决,即使函数本身不是。所以执行过程是:'var C'声明** => **窗口'load'事件监听器被指定(但还没有运行 - 窗口没有完成加载)** => **函数被分配给' C' ** => **窗口'load'事件触发(您的函数已被分配给'C')。 – Shai 2014-09-10 15:05:41

+0

小心阅读QA链接到的答案和评论(接受的答案不是很好) – 2014-09-10 15:05:56

+0

让我们做一个更简单但等同的例子:var foo = function(){alert(bar); }; var bar = 42; FOO();'。你认为这里会发生什么? “alert”会正常工作吗? – 2014-09-10 15:10:24

回答

0

这很简单。稍后执行window.onload,当C被定义时,如果你只是调用new C它会抛出,因为C是未定义的。

定义之后将你的电话,或使用“功能”关键字,而不是“无功”

+0

当window.onload准备好执行时,是否意味着我的所有JavaScript功能已被浏览器读取? – runners3431 2014-09-10 14:59:46

+0

是的,如果他们同步加载。 – Anatoliy 2014-09-10 15:00:47

0

的window.onload没有得到立即解雇定义它。当窗口完成加载时它会被触发。

你正在做的是说“当窗口加载完成时,执行这个函数来创建一个新的变量'c'。”

但是,由于var C是在全局范围内定义的,因此立即为其分配函数值。所以它已经准备好通过时间窗口进行评估。

相关问题