1
[JavaScript] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
function func1 ( num ) {
console.log( num );
var num = 456;
console.log( num );
}
var num = 123;
func1( num );
//分析
//1. 進行預解析,觀察聲明有兩個,一個函數聲明func1,一個是變量聲明var num
// func1被預解析記錄,並與函數體相連
// var num 被記錄
//2. 預解析結束,開始執行代碼
// 執行第一句話爲:num = 123,對num進行賦值
// 調用func1( num );
// 在進入函數體前,開闢函數內存需要的內存空間,將函數的參數var num = 123進行聲明
// 進入函數體,開始執行預解析,觀察到有個var num,重複聲明,忽略
// 執行函數體,第一個console.log( num ) => 123
// num = 456,對num進行賦值
// 第二個console.log( num ) => 456
// 函數執行結束,回到外層
|
2
[JavaScript] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
function func2 () {
console.log( num );
var num = 456;
console.log( num );
}
var num = 123;
func2( num );
//分析
//1. 進行預解析, 觀察到有兩個聲明, func2和var num
// func2被記錄,並與函數體相連
// var num被記錄
//2. 預解析結束,開始執行代碼
// 執行num = 123,對num進行賦值
// 調用func( num )
// 進入函數體,進行預解析, 記錄var num
// 執行第一個console.log( num ) => undefined
// 執行賦值語句, num = 456
// 執行第二個console.log( num ) => 456
|
3
[JavaScript] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
function func3 () {
console.log( num );
num = 456;
console.log( num );
}
var num = 123;
func3( num );
console.log( num );
//分析
//1. 進行預解析, 觀察到有兩個聲明,func3和var num
// func3被記錄,並與函數體相連
// var num被記錄
//2. 預解析借宿,開始執行代碼
// num = 123,進行賦值
// 調用func3( num )
// 進入函數體,進行預解析,無需要記錄對象,預解析結束
// 執行第一個console.log( num ) => 此時函數的局部作用域內無num,向全局中找,全局num = 123 => 123
// num = 456,進行賦值操作 => 更改全局中的num = 456
// 執行第二個console.log( num ) => 456
// 函數執行完畢,執行第三個console.log( num ) => 456
|
|
|