2012-09-11 118 views
3

我剛剛開始使用javascript,我看到了一些我無法解釋的東西。
我的js文件名爲TestClass.js及其以下:Javascript語句中的誤解

TestClass.SetError = function (errorDescription, errorCode, typedErrorCode) 
{ 
    alert("SetError "); 
} 

function SetError2(errorCode) 
{ 
    alert("SetError2 "); 
} 

可有人請解釋我的SETERROR和SetError2之間的區別?

+1

可能重複[在JavaScript中的函數表達式與聲明之間的區別是什麼?](http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression- vs-declaration-in-javascrip) – deceze

+0

另一個相關問題:http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname –

回答

1

代碼(SETERROR)的第一塊包含Anonymous Function Expression,其中第二部分的代碼(SetError2)包含Function Declaration。見Function Declarations vs. Function Expressions

另一個好文章:Named function expressions demystified

摘錄:

函數聲明進行分析和評價任何其他 表達式之前。即使聲明位於最後一個來源中, 也會被評估爲最重要的是包含在 範圍內的任何其他表達式

這基本上是主要區別。這不是很大,但值得注意。

1

SetError是對象TestClass的一個方法。而SetError2是一個全局函數。

0

SetError2是一種「命名」方法。 TestClass.SetError是引用匿名方法的TestClass的成員變量。 後來意味着你可以做TestClass.SetError = function(){ alert ("SetError2");}

-1

此:

function SetError2(errorCode) { 
    alert("SetError2 "); 
} 

等效於此:

window.SetError2 = function(errorCode) { 
    alert("SetError2 "); 
} 
+0

不完全...第一個是函數聲明第二個是函數表達式。請參閱http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname –

+0

@DmitryPashkevich我的意思是在概念上。試試這個:'function foo(){alert(「foo」); }; window.foo();'。我意識到JS運行時在內部處理方式存在細微差別,但是爲了理解他的兩種情況之間的差異,我認爲這可能有助於理解。 – troelskn

+0

哦,現在我明白了......但是由於差異真的很小,而且OP在詢問一個直接的問題,所以我會給他最多的信息,讓他意識到這一點。 –

1

區別在於瀏覽器如何將它們加載到執行上下文中。

函數在任何代碼執行前加載。

表達式僅在解釋器到達該行代碼時加載。

0

Javascript有對象和函數。

對象可以包含對象和/或函數。

這是一個對象:

var TestClass = {}; 

您可以添加新對象的TestClass對象如下:

var TestClass = { object : {}}; 

然後你就可以擁有這樣它的訪問:

var a = TestClass.object; 

你可以在一個對象中有一個功能:

var TestClass = {object:{}, setError:function(){/*function body*/}}; 

現在你可以調用測試類的功能是這樣的:

TestClass.setError(); 

此外,函數本身可以被定義如下:

function setError2(){/*function body*/} 

,你可以調用這樣的:

setError2(); 

通常,我們在對象中定義函數以某種方式實現JavaScript中的OO,並防止凌亂的js代碼。