2012-10-10 73 views
1

可能重複:
JavaScript: var functionName = function() {} vs function functionName() {}差異在構造函數中定義

我想知道是否有下面兩個構造函數之間的一些隱藏的區別:

var Person = function(name){ 
    this.say=function(){ 
     console.log(name); 
    } 
} 

和這一個:

function Person(name){ 
     this.say=function(){ 
      console.log(name); 
     } 
    } 

假設我們總是會寫:

var x = new Person('xxxxx'); 
x.say(); 

這似乎是爲了我一樣,但我在JavaScript真正的綠色,我想知道,如果某種形式是錯誤的以及是否有一些最佳實踐要遵循。

+3

的差異在這裏討論:http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname/336868#336868 – kinakuta

+0

我認爲這可能是今天第三次這個問題。 –

回答

4

就施工人員而言,沒有區別。 JavaScript中的所有函數都可以稱爲構造函數(不管它們是否引發錯誤都是不同的問題)。

區別在於聲明函數的方式。

第一個聲明是一個需要執行的變量。第二個聲明是一個懸掛的函數。

var foofunction foo JavaScript中的語句被提升到其關閉範圍的頂部(最近的function父類)。這意味着:

(function() { //closure for scope 
    doStuff(); 
    var foo = bar; 
}()); 

實際上是:

(function() { 
    var foo; 
    doStuff(); 
    foo = bar; 
}()); 

官能團反應類似:

(function() { 
    doStuff(); 
    function foo() { 
    bar = baz; 
    } 
}()); 

相同:

(function() { 
    function foo() { 
    bar = baz; 
    } 
    doStuff(); 
}()); 

這種區別是因爲一個重要函數在變量中聲明文件是無法訪問,直到後它已經宣佈:

(function() { 
    foo(); //this doesn't work and will result in an error 
    var foo = function() { 
    alert('works'); 
    }; 
}()); 

而功能只要訪問,因爲它的範圍之內的地方:

(function() { 
    foo(); //works! 
    function foo() { 
    alert('works!'); 
    } 
}());