這取決於函數的定義方式:
function foo() { console.log('foo'); }
foo(); // 正常執行,即使調用在定義之前
函數聲明會被「提升」至作用域頂部,包含函數體,因此隨處可呼叫。
var bar = function() { console.log('bar'); };
bar(); // 若調用在定義之前,會拋出 TypeError: bar is not a function
只有變數聲明 var bar 被提升,賦值(函數體)留在原地,調用時 bar 仍為 undefined。
JavaScript 引擎在執行前會先掃描作用域,將所有 var 變數聲明與 function 聲明移至頂部。理解這一機制,能避免許多「未定義」錯誤。
const/let + 箭頭函數,避免提升帶來的困惑。書中說法可能基於舊版 ECMAScript 或簡化教學,建議參考 MDN 等權威文件。