Re: [問題] javascript 函數的提升
※ 引述《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
05/13 00:55, 1F
※ 編輯: mrbigmouth (211.75.132.13), 05/13/2016 15:51:03
→
05/13 15:51, , 2F
05/13 15:51, 2F
討論串 (同標題文章)
完整討論串 (本文為第 4 之 4 篇):
Ajax 近期熱門文章
PTT數位生活區 即時熱門文章