JavaScript 的作用域規則、變量提升(預解析)是語言規範(ECMAScript 標準)定義的語義,而非特定引擎的實現細節。無論引擎是否進行「預解析」優化,代碼運行結果必須符合規範。
undefined。ReferenceError。var/let 規則。V8、SpiderMonkey、JavaScriptCore 等引擎通過解析器生成 AST、編譯器生成字節碼/機器碼、運行時執行 等階段實現語義。現代引擎採用懶解析、內聯緩存、隱藏類 等優化,但對開發者透明。
no-use-before-define)。
console.log(a); // undefined (var 提升)
var a = 1;
console.log(b); // ReferenceError (TDZ)
let b = 2;
foo(); // "foo" (函數聲明提升)
function foo() { console.log("foo"); }
bar(); // TypeError: bar is not a function (函數表達式 var 提升但未初始化)
var bar = function() { console.log("bar"); };
作用域與預解析是語言承諾,引擎如何兌現是實現細節。專注於規範語義,編寫健壯、可移植的 JavaScript 代碼。