Re: [問題] javascript 函數的提升

作者: mrbigmouth (大嘴先生)   2016-05-12 20:00:34
※ 引述《kisha024 (4545454554)》之銘言:
: ※ 引述《mrbigmouth (大嘴先生)》之銘言:
: : 兩個問題其實是一個解答,
: : function two() {
: : }
: : 這種直接以function開頭的宣告語法是一個包含了「宣告」與「定義」的動作:
: : 「宣告一個名稱為two的function並定義其內容」
: : 在系統進行hoisting的時候會被一口氣提升到scope最前方。
: : var two = function() {
: : }
: : 這段語法其實是「創建一個匿名function」「並將其位址指派給two變數」的分解動作
: : 於是系統進行hoisting時候被提升的只有var two,
: : =指定運算式是不會被提升的。
: : 所以你執行hoistFun()時log two會跑出undefined,
: : 因為該匿名function尚未指給two變數
: : 此外,匿名function沒有名稱,在系統debug時或Error stack裡會以
: : (anonymous function)的方式顯示,造成追溯code時的麻煩,
: : 如果可以,盡可能給function一個名稱是比較好的設計方式。
: 謝謝 想再請問 您說的'盡可能給function一個名稱是比較好的設計方式'是指第一種嗎?

: 另一個問題是 第二種和第三種在使用上 都是寫two() 那兩者有什麼差別嗎?
: 謝謝
: 第一種
: function two() {
: console.log('global two');
: }
: 第二種
: var two = function() name{
: console.log('local two');
: }
我猜你想表示的是這樣寫
var two = function name() {
console.log('local two');
}
這種寫法可以給定function的名稱(name),
也不會隨便產生變數(不會產生變數name),
也不會hoisting產生執行上的認知混亂(執行到two = ...之前two為undefined),
在error發生或debug時也能在stack上追溯到function名稱(name),
理論上是最好的宣告function方式。(如果你有足夠的名稱來命名 XD)
可惜的是,部份早期瀏覽器(其實就是IE啦)不支援這種寫法,
不過不要問我要哪一版IE才支援,我沒記這個 XD
: 第三種
: var two = function() {
: console.log('local two');
: }
作者: grence (dalalida)   2016-05-13 00:55:00
var a=function a1(){console.log(a == a1)}; a();
作者: mrbigmouth (大嘴先生)   2016-05-13 15:51:00
結果自己也少掉了括號 感謝提醒 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com