學習JavaScript中,作用域算是比較重要的一塊,因爲比較抽象,所以很多人都難免模模糊糊,包括我自己也是這樣
所以我自己寫下了自己的理解,如果有什麼不對的,請指出謝謝..
js解析順序和作用域 js的解析順序是按照作用域來讀取代碼
那麼什麼是作用域呢,JavaScript本身就是一個最大的作用域,
每一個函數執行的時候都會產生一個作用域.
很多人認爲js的解析順序是從上到下的,這是錯誤的
舉個例子: var a =10;
alert(a);
代碼會彈出10,
alert(a);
var a=10;
這時候會彈出一個undefined,而不是報錯,說明什麼,說明裏面已經有一個變量a,但是沒有賦值
每一個域裏面代碼的解析順序:
1.定義: 找var (只會找出變量名,但是並不會執行後面的賦值)
找function;
2.執行: 從上往下執行代碼;
我們在來看看作用域
我們來看一個例子
<script>
var a=10;//全局變量
</script>
<script>
alert(a)
</script>
結果卻顯示可以彈出結果,按理說兩個域之間是不可以相互跨越的 .
但 var a相當於window.a ,也就是全局變量,
相當於定義在window對象下.
那麼我們在舉個例子 ,
var a=0;
function mun(){ var b=50; }
這個是全局變量麼 ,答案肯定不是 ,上面已經說到每個函數都有一個自己的域,
而這個b 的作用域就是這個函數
而a是在script聲明的,所以他是全局變量..
作用域鏈 :
舉一個例子:
var a=10;
Fn();
a=20;
function Fn()
{ var b=20; alert(a); alert(b);
}
執行順序
1: 定義: 找變量 var a
找函數體 function Fn(){
var b=20;
alert(a);
alert(b);
}
2:執行:
a=10;
Fn()==>執行函數,進入Fn()作用域 ====>1:定義 var b
2: 執行:
b=20;
alert(a); //最終彈出10
alert(b) //最終彈出20
在來看一個例子:
var a=10;
var b=15;
Fn();
a=20;
function Fn(){
var a=5;
b=20;
alert(a);
alert(b);
}
alert(a);
alert(b);
解析順序:
1. 找變量 var a;
var b;
找函數體 function Fn(){
var a=5;
b=20;
alert(a);
alert(b)
}
2.執行 a=10;
b=15;
Fn(); ====> 1.var a
2. a=5;
b=20;
alert(a)//5
alert(b)//20 =====>返回父級作用域 (script)
a=20;
alert(a); //20
alert(b) //20
注意:函數裏面的 b=20;
沒有var 所以他是全局變量window.b
所以在全局的b=15 被重新賦值爲20;
下面的幾個例子我就不寫順序了 ...
var x=5;
a();
function a(){
alert(x); //undefined; var x=10;
}
alert(x); //5