var num=
80/*這是全域性作用域*/
alert
('num在外面輸出的為'
+num)
/*呼叫了全域性作用域的num 值為80*/
function
func()
func()
<
/script>
js中有變數宣告這乙個機制,當js在執行的時候,會分為兩個階段,乙個是預解析,乙個是執行,js預解析的時候會將所有用var宣告的變數以及函式宣告提公升到當前作用域的最頂端,而賦值的語句在原地等待執行,預解析之後,再從上往下地逐行解析**。
var num=
80alert
('num在外面輸出的為'
+num)
function
func()
func()
<
/script>
//宣告變數,並提公升到作用域的最前面
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 第乙...