2011-08-29 64 views
2

我看過JavaScript文件格式化兩種不同的方式,我不知道有什麼區別。JavaScript函數格式

<script> 

function foo() { /* a function */ } 

</script> 

name = { 

foo: function() { /* a function */ } 
foo2: function() { /* a different function */ } 
} 

這兩種寫JavaScript方法有什麼區別,爲什麼我會做另一種方法。

回答

5

第二種方法創建函數作爲對象name的成員。這會將它們封裝在name之內,而不是在全局名稱空間內創建它們。由於使用全局名稱空間的方式,JavaScript在變量和函數命名方面可能非常成問題。例如,在函數內部聲明變量時忘記使用var關鍵字會導致變量具有全局範圍而不是函數範圍。

因此,第二種方法允許您在全局級創建一個變量,並將其用作多個變量和函數的容器,而無需擔心與其他全局函數&變量名衝突。

一個常見的模式,你會看到(在道格拉斯Crockford的的Javascript建議:好的部分):

var myApplication = { 
    var1: 'some variable'; 
    var2: 'some other variable'; 
    var3: 12345 

    foo1: function() { 
    // do something 
    }, 
    foo2: function() { 
    // do something else 
    } 
}; 

實際上,我在這裏創建了全球唯一的變量是myApplication,那就是不會導致與全局命名空間中的其他任何命名衝突。我可以打電話給我的功能,如:

myApplication.foo1(); 
myApplication.foo2(); 
+0

有趣。 var1,var2和var3變量僅對封裝函數「全局」嗎?如果你想要「myApplication」的多個實例,比如它是一個類。所以你最終得到了如下結果: myApplication1.foo(); myApplication2.foo(); – SharpBarb

+0

@SharpBob創建多個類實例,還有另一種使用構造函數創建對象的方法。不同的語法。查找有關示例的JavaScript類構造函數 –

0

第二種形式稱爲命名空間。

它讓你在裏面定義函數和varibales。

把它看成是在Java類,

您可以聲明只有通過你的命名空間訪問的方法和屬性。

在你的例子中,它可以讓你定義2個叫做foo的函數。

一個是全球的(第一個) 一個是對象調用的名稱(第二個)內

,如果你想在某個地方調用第二個,你必須提供命名空間 例如:

name.foo()