javascript 函數聲明的優勢分析
我對箭頭函數絕對是真愛,但要聲明一個頂級函數時,我仍用“土氣”的函數聲明。
為什么呢?“Uncle Bob” Martin 是這么說的:
花1小時寫代碼,就要花10小時檢查代碼。查找漏洞都成了寫代碼的一部分了,這個差距太懸殊。就算寫代碼多費點時間,代碼也要簡單易懂。—— Robert C. Martin《Clean Code: A Handbook of Agile Software Craftsmanship》
相比函數表達式,函數聲明有兩大優勢:
1
目的明了
每天看上千行代碼,快速了解程序員的目的非常重要。
看看這行代碼:
const maxNumberOfItemsInCart = 。。.;
讀完了還是不知道這省略符號是函數還是其他什么值。它可能是:
const maxNumberOfItemsInCart = 100;
也可能是:
const maxNumberOfItemsInCart = (statusPoints) =》 statusPoints * 10;
如果使用函數聲明就沒有這個麻煩了。
請看:
const maxNumberOfItemsInCart = 100;
對比:
function maxNumberOfItemsInCart(statusPoints) {
return statusPoints * 10;
}
從一開始目的就很明了。
不過,如果你的代碼編輯器可以用顏色區分代碼,或者你在用一個 Speed Reader,就當我什么都沒說。
你們肯定在暗自贊嘆函數聲明既簡潔又迷人吧。
實際上,僅這一個原因還不足以服人,還有另外一個原因。
2
Order of declaration == order of execution
執行順序和聲明順序一致時,是最理想的。如果能做到執行時才聲明使用 const(常數)關鍵字的值就很厲害了。
都退后,我要開始裝逼了
Fair warning:接下來我要放大招了——下文“行話”連篇,但你只要明白在聲明之前不能使用常數就好。
以下的代碼會拋出一個錯誤:
sayHelloTo(‘Bill’);
const sayHelloTo = (name) =》 `Hello ${name}`;
這是因為,當 Java 引擎閱讀代碼時,會綁定(bind)而非初始化sayHelloTo。
Java 中所有聲明都是提升(hoist)和綁定的,但初始化的方式各自不同。換言之,Java 提升了sayHelloTo的聲明——先閱讀,再置其于頂層,然后創建空間來儲存其值——但在執行之前不會聲明sayHelloTo。
sayHelloTo綁定和初始化的時間差叫作“暫存死區(TDZ)”。
如果在瀏覽器里直接使用ES2015(而不是借助Babel等使用ES5),以下的代碼也會拋出錯誤:
if(thing) {
console.log(thing);
}
const thing = ‘awesome thing’;
以上的代碼是用var而非const寫的,不會拋出錯誤,因為變量被綁定時會初始化為undefined,而常數被綁定時完全不會被初始化。有點偏題了……
函數聲明不會有此類 TDZ 問題。如下文,代碼可以是:
sayHelloTo(‘Bill’);
function sayHelloTo(name) {
return `Hello ${name}`;
}
這是因為函數聲明在被綁定時就被初始化了——這是在執行代碼之前。
所以不論何時進行函數聲明,代碼開始執行時,語法都是符合其作用域的。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%