JS之作用域鏈以及變數的宣告提公升

2021-10-04 20:17:03 字數 1873 閱讀 5486

var num=

80/*這是全域性作用域*/

alert

('num在外面輸出的為'

+num)

/*呼叫了全域性作用域的num 值為80*/

function

func()

func()

<

/script>

var num=

80alert

('num在外面輸出的為'

+num)

function

func()

func()

<

/script>

js中有變數宣告這乙個機制,當js在執行的時候,會分為兩個階段,乙個是預解析,乙個是執行,js預解析的時候會將所有用var宣告的變數以及函式宣告提公升到當前作用域的最頂端,而賦值的語句在原地等待執行,預解析之後,再從上往下地逐行解析**。

//宣告變數,並提公升到作用域的最前面

var num;

//在原位進行賦值

num=

100;

var num =

100function

func()

func

()

var num;

function

func()

num=

100;

func()

;

注意:

作用域鏈:就是變數生效的範圍和查詢的規則

//全域性變數  0級鏈

var num=

123function

func1()

}

練習**

var num=

111;

function func1()

func2()

console.

log(num)

/*num=????*/

} console.

log(num)

/*num=????*/

func1

()

答案:

//0級鏈

var num=

111;

function func1()

func2()

console.

log(num)

/*num=333*/

} console.

log(num)

/*num=111*/

func1

()

函式內部優先訪問函式內部的區域性變數

如果函式內部沒有,就會往上一層作用域查詢

如果查詢到了全域性作用域,如果全域性作用域都沒有,就會報錯*** is not defined ,***變數沒有定義。

總結:就近原則函式內部宣告的變數,只能給函式內部來使用

為了解決預解析的問題

可以使用let變數和const變數兩個新語法

let變數和const變數

let:變數可以先進行宣告,後賦值,或者宣告的時候同時賦值。好處是–不參與預解析,**從上往下按書寫順序執行,生成乙個塊級作用域。

const:常量宣告的時候必須要進行賦值,賦值後值就不能被修改,修改的時候瀏覽器會出現報錯。好處是防止未知的覆蓋衝突,因為變數的覆蓋沒有任何的提示。

JS 宣告提前和作用域鏈以及例項

宣告提前 要明確var a 1 這是乙個變數的宣告 賦值的過程。宣告提前就是說會把變數以及函式的宣告提到 的頂部。也就是說對於變數,只會提前var a 的宣告部分。作用域鏈 js中沒有塊級作用域,但有函式作用域 函式在執行的過程中,先從自己內部找變數 如果找不到,再從建立當前函式所在的作用域去找,以...

js深入理解之作用域鏈

語法分析,分析3樣東西 第1步 先分析引數 第2步 再分析變數宣告 第3步 分析函式宣告 乙個函式能使用的區域性變數,就從上面的3步分析而來 具體步驟 0 函式執行前的1瞬間,生成 active object 活動物件 下稱ao 1 1.1 函式宣告的引數,形成ao的屬性,值全是undefined,...

JS變數宣告跟變數作用域

js的變數宣告存在變數提公升 對js指令碼執行的時候,函式的宣告會被提取到頂端執行。所以 如 add 1,2 function add a,b 是可以執行列印3的。對於變數而言,宣告也會被提前。但是賦值的位置是不變的 如 console.log a var a 12 console.log a 第乙...