函數的作用域
1.全局變量=公用衛生間
2.局部變量=次臥衛生間
局部變量 全局無法使用
局部聲明變量不加var的話就變成全局變量(不推薦使用)
3.閉包=次臥的可以用自己的衛生間,也可以用公用衛生間;
預解析
1、先把變量聲明 全部提前,賦值不動
2、函數也有預解析,直接提前
3、預解析 不會脫離函數作用域,也不會沖出script標簽 最多提到自己標簽的頂部
代碼執行順序 見一個srcipt解析執行一個,執行完了 在執行下一個
案例1:
alert(a);
var a=12;
解答:預解析直接把var a提前,但是賦值不動
彈出一個沒有賦值的變量,是undefined
案例2:
function show(){
alert(a);
var a = 12; //預解析不回沖出 函數作用域
}
show();
alert(a);//報錯
解答:第一個show();調用了函數裡面彈出undefined;
第二個alert(a);局部變量,全局無法使用,所以報錯not defined
案例3:
show();
function show(){
alert(1);
}
解答:函數也有預解析,直接提前,所以調用的時候可以彈出1
這也正印證了那句話:函數在哪裡定義不重要,重要的是在哪裡調用
案例4:
var a = 7;
if(a%2 == 1){
function show(){
alert('奇數');
}
}else{
function show(){
alert('偶數');
}
}
show();
解答:判斷只是用來迷惑人的,判斷走了第一條語句,但是函數是不會執行的
但是調用的函數show();只看下面的(從上到下的順序,下面覆蓋了上面的重名函數)所以alert('偶數');
案例5:
show();
var show = function(){
alert(1);
}
解答:var show 提前值不動,給一個變量加();答案是not a function