JS代碼解析原則javascript
首先js引擎在讀取js代碼時會進行兩個步驟,第一個步驟是解釋,第二個步驟是執行。java
所謂解釋就是會先通篇掃描全部的js代碼,而後把全部聲明提高到頂端,第二步是執行,執行就是操做一類的。函數
案例1:spa
<script type="text/javascript">
console.log(a);
var a=10;
</script>
以上代碼輸出undefinedip
緣由:變量提高(把變量聲明提高到當前執行環境的最頂端)it
以上這段代碼至關於:io
var a ;console
console.log(a);function
a=10;變量
案例2:
<script type="text/javascript">
foo();
function foo() {
console.log("aaa");
}
</script>
結果輸出:aaa
原理:函數聲明提高(函數聲明提高直接把整個函數提到執行環境的最頂端)
至關於:
function foo() {
console.log("aaa");
}
foo();
變量提高只提高函數名,而函數提高會提高整個函數題。注意:函數提高在變量提高上面。
案例3:
foo();
foo=function() {
console.log("aaa");
}
運行結果是:foo is not a function
緣由:仍是進行了變量提高
至關於:
var foo;
console.log(foo);//undefined
foo();//foo is not a function
foo=function() {
console.log("aaa");
}
上面代碼輸出undefined是由於變量提高後並無賦值所以輸出undefined
輸出foo is not function 緣由是:js解析遇到foo()時會默認當作函數來解析
案例4:
console.log(foo);
var foo=10;
function foo() {
console.log(10);
}
console.log(foo);
輸出結果:
f foo(){
console.log(10);
}
10
10
>
原理:
至關於:
function foo() {
console.log(10);
}
var foo;
console.log(foo);
foo=10;
console.log(foo);
console.log(foo);
注意:函數提高在變量提高上面,第一個console.log(foo);爲何會輸出函數題呢。緣由在於var foo;並未有賦值只是聲明,所以他會調用上面的值
例如:
var b=10;
b=10;
console.log(b);//10 輸出上一個值不會輸出undefined
可是更改後:
var b =10;
b=20;
console.log(b);//20 輸出20不是上一個值
總結:關於變量提高,必定要注意細心思考一下,還有就是,函數提高在變量提高之上。
提高的順序是:函數-->變量提高
變量的提高就是先把全部的變量的定義先提取出來,而後再開始對變量去賦值。