javascript預解析詳解


1、定義

預解析:在當前作用域下,js運行之前,會把帶有var和function關鍵字聲明的變量先聲明,並在內存中安排好。然后從上至下解析js語句。而且function的聲明優先於var聲明。

2、var聲明

通過var聲明的變量,進行預解析的時候:先聲明變量,不管變量有沒有賦值,聲明時都賦值為undefined。

console.log(a); //undefined
var a = 1;
console.log(b); //undefined
var b = function(){}
1
2
3
4
5
注意:
(1)同名的var聲明和同名的函數聲明,不管二者書寫先后順序,函數聲明會覆蓋掉var聲明的變量;
(2)同名的var聲明,后者會被忽略;
(3)同名的函數聲明,后者會覆蓋前面的

console.log(a) //function a(){}
var a = 10;
console.log(a) //10
var a = 20;
console.log(a) //20
var a = function () {
// body...
}
console.log(a) //function(){}
function a(){}
console.log(a) //function(){}
/*若在此處加下面的聲明*/
/*
function a(name){this.name = name}
*/
//則最上面的a輸出:function a(name){this.name = name}

3、function聲明

function進行預解析的時候,不僅是聲明而且還定義了函數體,在內存中會開辟一塊內存空間,存儲的是函數體的字符串,不會執行。調用以后執行。

console.log(a) //function a(name){this.name = name}
function a(name){this.name = name}
1
2
注意:直接在函數后面加(),會報錯。這樣的函數聲明時,先聲明函數,然后聲明(),這個()是匿名函數,聲明會報錯

function a(){}() //報錯
1
注意問題

(1)預解析,不會超出script標簽

<script>
console.log(a) // 報錯
</script>
<script>function a(){}</script>
1
2
3
4
(2)后面script標簽中可以訪問呢前面script標簽中的js,因為js是從上至下執行的

<script>
function a(){}
var a = 10
</script>
<script>
console.log(a) //10
</script>
1
2
3
4
5
6
7
(3)匿名函數可以帶名字,但是不等同於定義了一個函數

console.log(a) //undefined
fn() //報錯
var a = function fn (argument) {
// body...
}
1
2
3
4
5
(4)函數內部同名變量額聲明高於傳入的同名參數

var a = 10
function fn(a){
var a = 20
console.log(a)//20
}
fn(a)
1
2
3
4
5
6
var a = 10
function fn(a){
console.log(a)//undefined
}
fn() //因為調用時,沒有穿參數
1
2
3
4
5
(5) 函數內參數的聲明高於外部同名變量的聲明

var a = 10
function fn (a){
console.log(a)//undefined
}
fn()
1
2
3
4
5

var a = 10
function fn (b){
console.log(a) // 10
}
fn()
//因為函數的形參是b,函數內的參數是a  不一樣,所以還是  尋找全局變量a
或者

var a = 10
function fn (){
console.log(a) // 10
}
fn()
//因為函數沒有傳參數  尋找全局變量a


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM