聲明提早: 函數
在程序正式執行以前,都會將全部的var聲明的變量提早到開始位置,集中建立,而賦值留在原地。spa
例如這樣一段代碼code
console.log(a) var a = 100; console.log(a); var a = 200; console.log(a); console.log(b); b = 10; console.log(b);
聲明提早以後實際上運行的前後順序是blog
var a; console.log(a) //undefined a = 100; console.log(a); // 100 a = 200; console.log(a); // 200 console.log(b); // ReferenceError b = 10; console.log(b); // 10 //只要碰到聲明提早的問題,都要先提早,再判斷輸出 //代碼中a變量的聲明應提到做用域最前面,注意js中只有全局做用域和函數做用域 // 賦值留在原地,只聲明沒賦值的爲Undefined // 變量b 沒有聲明而直接使用 會報錯,可是未聲明直接賦值的話,js中就會自動爲其建立同名變量,再保存數據,不會出錯。 // 所以從一個未聲明過的變量中取值 會出錯
函數中: 在程序執行以前或者函數被調用前,將var聲明的變量和function聲明的函數提到當前做用域頂部集中建立,賦值留在原地。作用域
注意:io
匿名函數 (定義時不指定函數名的函數) 定義完馬上執行,執行完馬上釋放,只有肯定函數值執行一次時使用,不提早console
匿名函數自調:定義在哪兒,就在哪執行,不提早。function