<div id="app"> <button onClick="app()">點擊1</button> <button onClick="app1()">點擊2</button> </div> <script> function app () { console.log(this); } function app1 () { app();
}
app();
</script>
非嚴格模式下,打印window; [object Window], app
嚴格模式下,打印undefined函數
app1(); function app1(){ } app1(); function app1(){ var i =3; console.log(i); } function app1(){ var i =2; console.log(i); }
輸出以下:this
2spa
2code
解釋:後面的函數會覆蓋前面的,因此執行最後一個函數。blog
console.log(a); //undefined var a = 3; console.log(a); //function a() function a(){};
由此可知爲何輸出的是函數a。拓展一下:ip
var a; function a(){}; console.log(a); //function a() var a = 3; function a(){}; console.log(a); //3
同一個標識符的狀況下,變量聲明與函數聲明都會提高;函數聲明會覆蓋變量聲明,但不會覆蓋變量賦值,即:若是聲明變量的同時初始化或賦值那麼變量優先級高於函數。io
a=10; console.log(a); var a = 3; function a(){}
1)函數聲明會置頂
2)變量聲明也會置頂
3)函數聲明比變量聲明更置頂:)
4)變量和賦值語句一塊兒書寫,在js引擎解析時,會將其拆成聲明和賦值2部分,聲明置頂,賦值保留在原來位置
5)聲明過的變量不會重複聲明console
按以上的規則
題主的代碼等價爲function
function a(){} var a;//實際無效 console.log(a); a = 3;