2014-09-10 95 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是在全局範圍內定義的,因此立即爲其分配函數值。所以它已經準備好通過時間窗口進行評估。

相關問題