2012-09-10 54 views
4

可能重複:
JavaScript: var functionName = function() {} vs function functionName() {}
What is the difference between a function expression vs declaration in Javascript?爲什麼我應該爲JavaScript中的變量分配一個函數?

我試圖理解JavaScript的 「最佳實踐」。

此代碼是從jqfundementals.com

// create a function that will greet a person, 
// and assign the function to the `greet` variable 
var greet = function(person, message) { 
    var greeting = 'Hello, ' + person + '!'; 
    log(greeting + ' ' + message); 
}; 

greet('Jory', 'Welcome to JavaScript'); 
greet('Rebecca', 'Thanks for joining us'); 

我爲什麼要分配功能的迎接變量?

我第一個衝動將它寫這樣的:

function greet (person, message) { 
    var greeting = 'Hello, ' + person + '!'; 
    log(greeting + ' ' + message); 
}; 

這兩個是實現之間的區別是什麼?

+3

我有一種感覺,這已被問過。 –

+0

非常好,謝謝@Quentin的鏈接 –

+0

雖然這些鏈接回答了膚淺的問題,但我認爲它留下了「爲什麼做這個」這個方面沒有答案,因此這不應該被認爲是重複的。 @NathanKoop你同意嗎? – delnan

回答

-2

沒有實際區別,但var窗體使您能夠在使用之前聲明具有遞歸功能。

簡單的例子:

var func1, func2; 

func1 = function (count) { 
    count = count - 2; 
    if (count > 0) { 
     func2(count); 
    } 
} 

func2 = function (count) { 
    func1(count + 1); 
} 

func1(10); 

雖然

function func1 (count) { 
    count = count - 2; 
    if (count > 0) { 
     func2(count); 
    } 
} 

function func2 (count) { 
    func1(count + 1); 
} 

func1(10); 

是完全可以接受的了。由於變量提升,解釋者將用前者替換它。

+1

這是不正確的。對於聲明爲「函數名稱」的函數*語句*(與函數*表達式*不同),'name'具有相同的範圍並且具有'var name'變量。 – 2012-09-10 18:23:18

+1

函數聲明可能會被提起,並且如果函數在另一個函數中被調用,它會在運行時查找,而不是解析時間 - 因此推理是雙重錯誤的。 – Quentin

+1

在JavaScript中未強制使用之前聲明聲明,而是應用變量提升。你的論點是什麼? – Halcyon

1

這些片段之間沒有任何區別,除了允許您在定義之前的行之前調用前一個函數的提升。但這只是一個讓你熱身的簡單例子。實際上,人們不會將這些函數分配給變量,而是直接將其傳遞給其他函數。或者他們在表達上下文中使用它們。或者他們動態地決定要存儲哪個功能。或者其他任何事情。

相關問題