js代碼由瀏覽器的js解釋器來執行,解析共分為2個步驟:預解析和代碼執行。
<mark>預解析規則:</mark>
1. 把變量的聲明提升到調用這個變量的最前面,只會提升聲明,不會提升賦值。
2. 把函數的聲明提升到調用這個函數最前面,只會提升聲明,不會提升調用。
3. 先提升var(變量),再提升function(函數)。需要注意變量名與函數名同名的情況,最好避免。
預解析過程總是把聲明提到調用的最前面。
```js
// 不聲明直接調用——報錯
console.log(num);
// 先調用,再聲明——undefined
console.log(x); // undefined
var x = 100;
/*相當于:
var x; // 1. 先聲明變量x
console.log(x); // 2. 調用變量x,但未賦值
x = 100; // 3. 對變量x賦值
*/
var a = 25;
function abc (){
alert(a);//undefined,調用其實是函數內部的a
var a = 10;
}
abc();
/* 上面代碼預解析的過程為:
var a; // 聲明變量a,函數外面的a
a = 25; // 對a賦值,函數外面的a
function abc(); // 聲明函數abc
abc(); // 調用函數
var a; // 聲明變量a,函數內部的a
alert(a); // 函數內部的a
a = 10;
*/
console.log(a); // 25
function b() {
console.log('aaaaa');
}
b(); // aaaaa
var b = 1;
console.log(b); // 1
```
<br/>
```js
// 1、-----------------------------------
var num = 10;
fun();
function fun() {
console.log(num); // undefined,調用的其實是函數內部的num
var num = 20;
}
//2、-----------------------------------
var a = 18;
f1();
function f1() {
var b = 9;
console.log(a); // undefined
console.log(b); // 9
var a = '123';
}
// 3、-----------------------------------
f1();
console.log(c); // 9
console.log(b); // 9
console.log(a); // 報錯
function f1() {
var a = b = c = 9; // 相當于var a=9; b=9; c=9; // c和b是全局變量
//var a=9, b=9, c=9; 相當于var a=9; var b=9; var c=9;
console.log(a); // 9
console.log(b); // 9
console.log(c); // 9
}
```
<mark>js代碼執行過程</mark>
全局預解析 -> 執行全局代碼 -> 遇到函數 -> 對函數內部預解析 -> 執行函數內部代碼 -> 執行全局代碼。
- js應用場景
- js組成
- js書寫位置
- 浮點數精度問題
- undefined與null的區別
- 數據類型轉換
- 運算符優先級
- 代碼調試
- 函數
- 函數的定義和調用
- 函數的return細節
- 函數是一種數據類型
- this的指向
- 函數成員
- 函數閉包
- 作用域
- 預解析
- js對象
- 對象的創建與調用
- new關鍵字
- this關鍵字
- 構造函數創建對象
- 事件
- 數據類型
- 繼承
- 雜項
- 如何阻止標簽的默認行為
- 為一個標簽綁定或移除任何一個事件
- 如何阻止事件的冒泡行為
- 事件的三個階段
- 移動元素的條件
- 勻速動畫函數封裝
- 變速動畫函數封裝
- 獲取元素的css屬性值
- 數據類型判斷方法
- 創建對象的7種寫法
- 如何繼承
- 為js內置對象添加原型函數
- 將局部變量轉換為全局變量
- call函數的用法
- 沙箱
- 淺拷貝
- 深拷貝
- 對象賦值會改變對象
- 解析URL中的字符串
- 格式化日期
- 獲取當前瀏覽器類型
- Vue3.x
- 調式工具Vue Devtools