2013-07-29 42 views
0

我們有在JavaScript區別:JavaScript的

//Declaration 1 
var foo = function(){ 

// code goes here 
} 

//Declaration 2 
function foo(){ 
// same code here 
} 

提到的兩個函數聲明之間有什麼區別時,我試圖用Foo的定義一個類來創建其他對象

var newObj = new foo(); 

宣言2工作聲明1不允許 me創建此類型的對象

+0

是的,這是一個重複的,遺憾的問題頭球被不容易搜索 – sij

+0

@sij:我希望我的回答幫助你! –

+0

這兩個版本都在我嘗試使用時發揮作用。 – Neil

回答

0

首先創建一個局部變量,該變量被分配了一個函數。第二個聲明創建一個函數。在第一種情況下,沒有功能用於客戶端。這就是爲什麼你不能創建對象。

0

您可以創建函數對象。這裏在你的案例聲明中1考慮foo是一個變量,所以你不能創建任何變量的對象,這是爲什麼聲明2工作和聲明1不允許你。

0

第一個創建一個匿名(無名)函數並將其分配給名爲foo的變量。第二個聲明名稱爲foo的函數。通常這兩種形式可以互換使用,但仍然存在一些差異。以下兩點是我想到的主要區別。第一種可能是負責您遇到什麼:

吊裝

在第二個例子中,功能齊全的定義將被吊起到當前範圍的頂部。所以,當你寫:

var a = new A(); 
function A() {} 

的JavaScript會解釋這一點:

function A(){} 
var a; 
a = new A(); 

...您的代碼將正常工作。

但是在第一個例子中,只有變量聲明會被提起。函數體保持它的位置。所以這個:

var a = new A(); 
var A = function(){}; 

將被解釋爲這樣:

var a, A; 
a = new A(); 
A = function(){}; 

這將導致一個錯誤,因爲A仍然受到試圖創建一個實例的時間不確定。

name屬性

正如我所說的,第一個創建一個匿名函數。這意味着,如果您嘗試訪問該功能的name屬性會返回一個空字符串:

var A = function(){}; 
console.log(A.name) //{empty string} 

在第二個例子中,你的函數的實際名稱A

function A(){} 
console.log(A.name) //A 
2

這是一個函數表達式:

//Declaration 1 
var foo = function(){ 

// code goes here 
} 
  • 在這種情況下,func表達式是匿名的,但分配給var foo。 參考

這是一個標記功能:

//Declaration 2 
function foo(){ 
// same code here 
} 
  • 這裏沒有任何真正偉大的理由做表達變種。您 應該總是嘗試爲構造函數使用帶標籤的語句,因此您可以通過其構造函數標識對象的「類型」。

  • 人們大多使用此處吊裝是必要的。 提升僅僅意味着 在它被定義爲之前調用了一些東西。

    非常非常簡單的例子

    foo(); // alerts 'hello' 
    function foo() {alert('hello');} 
    V/s 
    foo(); // throws an error since foo is undefined 
    var foo = function() {alert('hello');}