第一個創建一個匿名(無名)函數並將其分配給名爲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
是的,這是一個重複的,遺憾的問題頭球被不容易搜索 – sij
@sij:我希望我的回答幫助你! –
這兩個版本都在我嘗試使用時發揮作用。 – Neil