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

看板Ajax作者 (大嘴先生)時間8年前 (2016/05/12 20:00), 8年前編輯推噓0(002)
留言2則, 2人參與, 最新討論串4/4 (看更多)
※ 引述《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'); : } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.164.62.214 ※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1463054436.A.668.html ※ 編輯: mrbigmouth (1.164.62.214), 05/12/2016 20:01:11

05/13 00:55, , 1F
var a=function a1(){console.log(a == a1)}; a();
05/13 00:55, 1F
※ 編輯: mrbigmouth (211.75.132.13), 05/13/2016 15:51:03

05/13 15:51, , 2F
結果自己也少掉了括號 感謝提醒 XD
05/13 15:51, 2F
文章代碼(AID): #1ND71aPe (Ajax)
文章代碼(AID): #1ND71aPe (Ajax)