[英]Anonymous function VS const function - javascript
從這個討論開始:
我對 JavaScript 中的函數聲明有疑問。
通過匿名函數聲明,我的意思是這樣的( https://en.wikibooks.org/wiki/JavaScript/Anonymous_Functions ):
var myFunction = function (fruit){
alert('I like ' + fruit);
}
const 我的意思是:
const myfunction = (fruit) => alert('I like ' fruit);
使用匿名函數還是使用 const 更快? 我讀過使用 const 可以在 JavaScript 中進行編譯優化。 有什么理由我應該使用一個而不是另一個?
這甚至相關嗎?
匿名函數 VS 常量函數
估計你在比較
var func = function() { };
// or
let func = function() { };
和
const func = function() { };
這樣做的主要原因不是優化。 它通過代碼記錄您從不打算更改func
,並讓引擎保護您免於意外這樣做。 (我還應該注意,從 ES2015 開始,這些函數都不是匿名的。它們都具有名稱func
,因為 ES2015 添加了為通過基於上下文的“匿名”函數表達式創建的函數分配名稱的規則,包括簡單分配的規則和上面一樣。)
但關於優化:
與大多數 JavaScript 優化問題一樣,答案是:這取決於. 從理論上講,如果您從不打算更改func
中的值,則使用const
意味着 JavaScript 引擎可以選擇在該值永遠不會更改的情況下進行優化。 請注意,它並不能免除引擎處理符號將在嵌套范圍或類似范圍內隱藏的可能性。
引擎是否確實基於該知識以有意義的方式進行優化,值不會改變將取決於引擎的實現,並且可能會因引擎而異。
這是否使得通過常量查找函數以便調用它比通過變量查找更快也取決於引擎的實現。
任何絕對差異是否轉化為程序中的實際收益將取決於上述內容、程序的結構、使用函數的頻率、查找時間與函數實際執行的時間的比較(例如,swamping),等等
這取決於。 :-)
如果您遇到您認為查找時間導致實際問題的情況,請對其進行分析並查看它是否有所作為。
重新編輯:
通過匿名函數聲明,我的意思是這樣的:
function myFunction(fruit){ alert('I like ' + fruit); };
const 我的意思是:
const myfunction = (fruit) => alert('I like ' fruit);
第一個不是匿名函數。 (實際上,它們都不是。)這是一個名為myFunction
的函數,通過函數聲明創建。 (作為一個聲明,最后不需要;
。)函數聲明不能創建匿名函數,¹名稱是聲明的必需部分。²
也就是說,這並不重要,因為一旦創建了函數(它發生在與我上面顯示的表達式不同的時間),它的行為就非常像var func = ...
例子func
是已解決,是否可以更改func
等
您的第二個示例與您的第一個示例在三個重要方面不同:
它將函數引用分配給一個常量。
它使用箭頭函數,而不是function
函數(由於沒有更好的術語,我將稱之為“簡單”函數)。
您的箭頭函數版本返回調用alert
的結果(因為您在箭頭函數上使用了簡潔的主體)。 您的聲明版本沒有。
我們已經處理了#1 的任何性能方面。 我懷疑,#3 不太重要。
Re #2(它是一個箭頭函數):調用一個箭頭函數比調用一個簡單的函數需要更少的工作(理論上)。 引擎不必設置arguments
偽對象,也不必創建this
綁定。 但是如果箭頭函數使用this
,則需要做更多的工作來查找它(它就像函數關閉的外部范圍中的變量)。 但是,這就是理論。 只要副作用不明顯,引擎就可以優化。 例如,如果您不在代碼中使用arguments
,現代引擎無論如何都會避免創建它,即使對於簡單的函數也是如此。 而且我希望圍繞this
的箭頭函數使用的優化非常好,因為一旦函數存在,他們看到的this
就不能改變。
所以(等待它) :這取決於。
¹ “函數聲明不能創建匿名函數” - 有一件事似乎是該規則的一個例外,那就是export default function() { /*...*/ };
是一個沒有明確名稱的函數聲明(是的,真的); 但是,使用名稱default
,因此它不會創建匿名函數。
² “...名稱是聲明的必需部分...”上面的export default
示例除外。 這是一個例外。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.