JavaScript預解析
坑
1Q :未宣告變數,直接輸出會出現什麼結果?
console.log(num);
1A :報錯:變數未被定義。
Uncaught ReferenceError: num is not defined
2Q :在輸出變數後才宣告並賦值變數會出現什麼結果? 1
console.log(num);
var num = 10;
2A :顯示 undefined 。
undefined
3Q :先呼叫函式,再定義函式會出現什麼結果? 2
fn();
function fn() {
console.log('Javier_Ji');
}3A :正常顯示。
Javier_Ji
4Q :先呼叫函式,再宣告函式表示式會出現什麼結果? 3
fn();
var fn = function() {
console.log('Javier_Ji');
4A :錯誤: fn 不是函式。
Uncaught TypeError: fn is not a function
解釋
JavaScript 程式碼是由瀏覽器中的 JavaScript 解析器來執行的。 JavaScript 解析器在執行 JavaScript 程式碼的時候分為兩步:
預解析:js 引擎會把 js 裡面的所有的 var 以及 function 提升到當前作用域的最前面。
程式碼執行:按照程式碼書寫的順序從上往下執行。
預解析分為:變數預解析(變數提升)和函式預解析(函式提升)
變數提升:把所有的變數宣告提升到當前的作用域最前面,不提升賦值操作。
函式提升:把所有的函式宣告提升到當前的作用域最前面,不呼叫函式。
示例
下面的程式碼執行後會得到什麼結果?4
fn();
console.log(c);
console.log(b);
console.log(a);
function fn() {
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
執行後結果如下:
Uncaught ReferenceError: a is not defined
針對2Q 的解答
先預解析,相當於執行了如下程式碼:
var num; 股票程式碼
var num; // 把變數宣告提升到當前作用域(本例中是全域性)最前面
console.log(num); // 執行後續的程式碼
num = 10; // 賦值
針對3Q 的解答
先預解析,相當於執行了如下程式碼:
function() {
console.log('Javier_Ji');
} // 把函式宣告提升到當前作用域(本例中是全域性)最前面
fn(); // 執行後續的程式碼,函式被正常呼叫
針對4Q 的解答
先預解析,相當於執行了如下程式碼:
var fn; // 把 var 宣告提升到當前作用域(本例中是全域性)最前面
fn(); // 執行後續的程式碼,由於函式還沒被定義,且 var fn; 語句定義的是變數,則會報錯, fn 不是函式
function() {
console.log('Javier_Ji');
} // 執行後續的程式碼
針對示例的解答
先預解析,相當於執行了如下程式碼:
function fn() {
var a;
a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
fn();
console.log(c);
console.log(b);
console.log(a);
本例中的程式碼 var a = b = c = 9; 相當於先在函式內部定義變數 var a ,之後賦值 a = b = c = 9 ,由此可得,變數 a 的作用域是在 fn 函式內部,而 b 和 c 相當於定義了一個全域性變數。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2693178/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript 預解析的原理及實現JavaScript
- 淺談JavaScript程式碼預解析 + 示例詳解JavaScript
- JavaScript中的預解析(變數提升)介紹JavaScript變數
- JavaScript中的預解析(變數提升)介紹!JavaScript變數
- 進擊JavaScript核心 --- (2)函式和預解析機制JavaScript函式
- JavaScript 之有趣的函式(函式宣告、呼叫、預解析、作用域)JavaScript函式
- 從 ECMA 規範解析 JavaScript 預設的取值和賦值行為JavaScript賦值
- 解析javascript中的thisJavaScript
- JavaScript 模組化解析JavaScript
- 淺談JS預解析JS
- 你不知道的JavaScript--Item6 var預解析與函式宣告提升JavaScript函式
- 全面解析JavaScript中this指向JavaScript
- 使用 Acorn 來解析 JavaScriptJavaScript
- JavaScript 繼承全解析JavaScript繼承
- JavaScript 中的 this 全面解析JavaScript
- JavaScript解析URL引數JavaScript
- JavaScript執行原理解析JavaScript
- JavaScript 執行原理解析JavaScript
- JavaScript 瀏覽器事件解析JavaScript瀏覽器事件
- Javascript解析之作用域理解JavaScript
- JavaScript解析SECS GEM報文JavaScript
- 預告:JavaScript模組全覽JavaScript
- JavaScript阻止預設動作JavaScript
- JavaScript 阻止預設動作JavaScript
- Spring原始碼解析—— IOC預設標籤解析(下)Spring原始碼
- android JSON解析資料-解析天氣預報AndroidJSON
- javascript this 用法例項程式碼解析JavaScript
- JavaScript 常見設計模式解析JavaScript設計模式
- JavaScript 的 this 指向問題深度解析JavaScript
- 44 個 JavaScript 變態題解析JavaScript
- 44個 Javascript 變態題解析JavaScript
- 解析JavaScript設計模型Iterator例項JavaScript模型
- JavaScript 七大繼承全解析JavaScript繼承
- 手寫javascript json解析器JavaScriptJSON
- JavaScript解析遠端json資料JavaScriptJSON
- 44個 Javascript 變態題解析 (上)JavaScript
- JavaScript中依賴注入詳細解析JavaScript依賴注入
- 利用同構JavaScript輕鬆解析URLJavaScript