預解析練習題及解析

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章