預決議:就是在決議代碼之前
1. 預決議做什么事?
- 把變數的宣告提前了----提前到當前所在的作用域的最上面
- 函式的宣告也會被提前---提前到當前所在的作用域的最上面
function f1() { console.log(num); var num = 10; } f1(); //此時運行結果是undefined
此時運行結果是undefined,因為預決議,變數宣告被提前了,實際按下面的方式決議的:
function f1() { var num console.log(num); num = 10; } f1(); //此時運行結果是undefined
舉例2:
//函式呼叫的時候,把會函式的宣告提升到作用域的上面 f1();//呼叫 var num = 20;//這個變數的宣告會提升到變數使用之前 function f1() { console.log(num); //var num=10; }
2. 預決議分段和區域作用域的問題
- 預決議中,變數的提升,只會在當前的作用域中提升,提前到當前的作用域的最上面
- 函式中的變數只會提前到函式的作用域中的最前面,不會出去
function f1() { console.log(num);//undefined var num = 10; } f1(); console.log(num);//報錯
- 預決議會分段(多對的script標簽中函式重名,預決議的時候不會沖突)
<script>
function f1() {
console.log("哈哈");
}
</script>
<script>
f1();
function f1() {
console.log("嘎嘎");
}
</script>
3. 快速識別預決議的結果
練習1:
var a = 25; function abc() { alert(a);//undefined var a = 10; } abc(); console.log(a);//25
練習2:
console.log(a); function a() { console.log('aaaaa'); } var a = 1; console.log(a);//1
預決議下的代碼解讀:
(變數宣告在最上面,下面是函式宣告)
var a; function a() { console.log('aaaaa'); } console.log(a); //此時輸出的是函式a的代碼 a = 1; console.log(a);//1
代碼結果:

練習3:
var a = 18; f1(); function f1() { var b = 9; console.log(a);//undefined console.log(b);//9 var a = '123'; }
預決議下的代碼解讀:
var a; a = 18; function f1() { var b; var a; b = 9; console.log(a);//undefined console.log(b);//9 a = '123'; } f1();
代碼結果:

練習4:
f1(); console.log(c); console.log(b); console.log(a); function f1() { var a = b = c = 9; console.log(a); console.log(b); console.log(c); }
預決議下的代碼解讀:
recap:
隱式全域變數: 宣告的變數沒有var, 就叫隱式全域變數
區域變數: 在函式內部定義的變數,是區域變數, 外面不能使用
function f1() { var a;//區域變數 a=9; //隱式全域變數 b=9; c=9; console.log(a);//9 console.log(b);//9 console.log(c);//9 } f1(); console.log(c);// 9 console.log(b);// 9 console.log(a);//報錯
代碼結果:

練習4:
f1();//-----報錯 var f1 = function () { console.log(a); var a = 10; };
預決議下的代碼解讀:
var f1; f1();//-----報錯,不能呼叫,因為下的f1是賦值的運算式 f1 = function () { console.log(a); //f1報錯,這里就沒有結果啦 var a = 10; };
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/167478.html
標籤:JavaScript
上一篇:JS基礎語法---作用域鏈
