2013-06-20 35 views
2

在window.onload事件上,我想要調用一個函數。 如果我將其定義爲如下所示,則函數不會被調用。爲什麼window.addEventListener不起作用?

try { 
    window.addEventListener("load", initialiseTable, false); 
} catch(e) { 
    window.onload = initialiseTable; 
} 

var initialiseTable = function() { 
    console.log("hello world!!"); 
}; 

,但如果我改變函數聲明

function initialiseTable() { 
    console.log("hello world!!");}; 

它的工作原理,任何想法?

+1

我想說的問題是執行順序爲'initialiseTable'用於聲明之前 –

+0

請看這裏http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs- function-functionname –

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Scope_Cheatsheet#function_oddities – Shmiddty

回答

3

,應該調用函數之前聲明。

通過function x(){},x將存在於當前作用域中,無論它聲明多麼晚。因爲副作用,更推薦var x = function(){}。例如:

var user = 'alien'; 
if(user == 'alien') { 
    function salute() { console.log("Welcome to Earth!"); } 
} else { 
    function salute(){ console.log("Good day!"); } 
} 

salute()將打印Good day!無論如何,即使這不是我們想要的。

+0

你是明星,謝謝! – 101V

0

只要把函數initialiseTable到第一位置,例如:

var initialiseTable = function(){ /*[...]*/ } 

後繼續調用。

0

函數聲明應該總是在它的調用之前。

在這一行: -

window.addEventListener("load", initialiseTable, false); 

initialiseTable不知道所以它應該放在後函數定義。 實際上,函數語句會導致其標識符在其代碼塊*中的任何內容被執行之前被綁定。函數聲明在任何代碼執行之前加載。它不同於以正常自上而下的順序評估的函數表達式。函數表達式僅在解釋器到達該行代碼時加載。所以如果你使用: -

var initialiseTable = function() { 
    console.log("hello world!!"); 
}; 

它不會工作,但這個工程: - 當您使用var x = function(){}聲明功能

function initialiseTable() { 
    console.log("hello world!!");}; 
1

既然你來自C#,所不同的是很像:

class A { 
    public int method2() { 
     //I can call method1 even though it *declared* later below 
     int a = method1(); 
    } 

    public int method1() { 

    } 
} 

VS

class B { 
    public int method2() { 
     bool a = method1(3); //I can't call it because it is *assigned* later below. 
         //In fact I cannot even compile it 
     Func<int, bool> method1 = x => x == 3; 
    } 
} 

您可能會注意到在JavaScript中的差異,如果你看一下:

function a() { 

} 

任何地方都沒有任務。

var a = function(){}一樣,明顯存在賦值並且與後面的C#示例類似。