看板 Ajax作者 mrbigmouth (大嘴先生)標題 Re: [問題] javascript 函數的提升時間 Thu May 12 16:37:16 2016
※ 引述《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一個名稱是比較好的設計方式。
--
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.75.132.13
※ 文章代碼(AID): #1ND42_UQ (Ajax)
※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1463042239.A.79A.html
--