首先,咱們看一下瀏覽器對js的執行順序:javascript
1,遇到script標籤進入做用域html
2,遇到函數調用進入做用域java
進入做用域後:瀏覽器
1,js預解析:函數
2,順序執行spa
開始從上到下順序執行,遇到表達式(+、-、*、/、++、--....)就去修改預解析裏面的變量值。code
上面沒有理解也不要緊,咱們會經過例子,來告訴你瀏覽器每一步的執行狀況(~ ̄▽ ̄)~ htm
例子:blog
<script type="text/javascript"> var a=100; function cc() { alert(a); var a=200; alert(a); } cc(); alert(a); var a; alert(a); var a=300; alert(a); </script>
1,瀏覽器遇到script進入做用域,開闢獨立空間Aip
2,開始預解析,找到var a=100,將a錄入空間A,有a=underfined。找到function,空間A保存function完整內容。找到var a,a指向空間A的a=underfined。找到var a=300,a指向空間A的a=underfined。此時空間A有:a=underfined、function cc(){.....},預解析完成
預解析:建立一個獨立的空間、找var、方法參數和function方法。遇到var和方法參數時,將var和方法參數聲明的變量保存爲underfined;遇到function方法時,完整保存function方法。
3,開始順序執行,遇到表達式(+、-、*、/、++、--....)就去修改預解析裏面的變量值。第一行就遇到了表達式「=」(var a=100),因此空間A中a的值修改成100。
繼續執行,遇到了函數調用cc(),再次進入做用域,開闢獨立空間B
4,執行完cc()後,繼續順序執行,遇到第三個alert(a),指向空間A,彈出100
5,繼續執行,遇到var a,因爲沒有表達式,因此空間A中a的值不變,還是100
6,繼續順序執行,遇到第四個alert(a),指向空間A,彈出100
7,繼續執行,遇到var a =300,有表達式「=」,因此空間A中a值修改成300
8,繼續順序執行,遇到第五個alert(a),指向空間A,彈出300