![](/img/trans.png)
[英]Why is variable declaration not allowed as a parameter, but function declaration is?
[英]Why is a function declaration not a statement while a variable declaration is
這似乎是一個愚蠢的問題,但我真的無法繞過它。 當我想到為什么在變量聲明之后有分號而不是函數聲明時,我開始懷疑這一點。 這是否意味着函數聲明是一個表達式?
聲明的官方含義是什么? 我一直在找答案,說一個語句是一個“命令”,告訴計算機該做什么,但不是一個函數聲明告訴計算機該怎么做? 它是否與執行代碼時加載時有關?
變量聲明可能有副作用(例如, var x = alert(42);
)。
函數聲明不能。
當我想到為什么在變量聲明之后有分號而不是函數聲明時,我開始懷疑這一點
帶分號的語句示例:
var foo = <expression>;
<expression>;
do <statement> while (<expression>);
不帶分號的示例:
if (<expression>) <statement>
try <block> catch (<identifier>) <block>
for (...) <statement>
{ <statement list> }
這是否意味着函數聲明是一個表達式?
不,這比那更復雜。 函數聲明不是語句。 它們也不是表達式,它們是源元素 。 語句和函數聲明都是源元素。 **
聲明的官方含義是什么?
我不能告訴你官方定義,但在JS的上下文中我會說“它是一個不產生可賦值結果/值的指令”。 另一方面,表達式產生可以在其他表達式中使用的結果。
**很高興知道,但有點偏離主題:由於函數聲明不是語句,因此技術上不允許在塊內使用它們。 如果我們也考慮吊裝,那就更加明顯了。 這個例子應該在每個瀏覽器中拋出語法錯誤,但不幸的是它沒有。
if (true) {
function foo() { alert('foo'); }
} else {
function foo() { alert('bar'); }
}
foo();
這導致不同瀏覽器中的不同行為。 雖然Chrome會顯示bar
,但Firefox會顯示foo
。 Chrome只提升兩個功能聲明,第二個覆蓋第一個。 Firefox將兩種聲明都解釋為函數表達式 。
在不同的瀏覽器中自己嘗試 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.