Re: [問題] javascript 函數的提升
※ 引述《mrbigmouth (大嘴先生)》之銘言:
: ※ 引述《kisha024 (4545454554)》之銘言:
: : 各位好
: : 我是參考這裡的資料
: : http://fireqqtw.logdown.com/posts/258823-javascript-function-notes
: : function one() {
: : console.log('global one');
: : }
: : function two() {
: : console.log('global two');
: : }
: : function hoistFun() {
: : console.log(typeof one);
: : console.log(typeof two);
: : one();
: : two();
: : function one() {
: : console.log('local one');
: : }
: : var two = function() {
: : console.log('local two');
: : }
: : }
: : ---------------------------------------------------------------------
: : 我不懂的是 two這個函數不是在hoistFun()裡面又被定義一次
: : 為什麼console.log(typeof two); 結果卻是undefined?
: : 另一個問題是 底下這兩種宣告方式 在使用上都是寫 two();
: : 那到底有什麼差別呢? 謝謝
: : function two() {
: : console.log('global two');
: : }
: : var two = function() {
: : console.log('local two');
: : }
: 兩個問題其實是一個解答,
: 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() {
console.log('local two');
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.127.81.14
※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1463043658.A.29A.html
→
05/12 19:27, , 1F
05/12 19:27, 1F
謝謝 我已經修改了 不知是否正確?
※ 編輯: kisha024 (140.127.81.14), 05/13/2016 15:26:59
推
05/23 02:17, , 2F
05/23 02:17, 2F
→
05/23 02:17, , 3F
05/23 02:17, 3F
→
05/23 02:18, , 4F
05/23 02:18, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 4 篇):
Ajax 近期熱門文章
PTT數位生活區 即時熱門文章