變數提升題目: (function(){ a=5 console.log(window.a) var a=10 console.log(a) })() 答案如下(還請先思考哦) //編譯後 (function(){ var a; a=5; console.log(window.a) //undefi ...
變數提升題目:
(function(){ a=5 console.log(window.a) var a=10 console.log(a) })()
答案如下(還請先思考哦)
//編譯後 (function(){ var a; a=5; console.log(window.a) //undefined a=10; console.log(a) //10 })()
函數提升題目:
function test(){ console.log(1,foo); console.log(2,bar); var foo='hello' console.log(3,foo); var bar =function(){ return 'world' } function foo(){ return 'hello' } } test()
答案如下:
//編譯後
//函數提升優先順序大於變數提升
function test(){ function foo(){ return 'hello' } var foo; var bar; console.log(1,foo); //foo(){ } console.log(2,bar); //undefined foo='hello' console.log(3,foo); //hello bar =function(){ return 'world' } } test()
總結:
1.對於用var聲明的變數,聲明會提升到其所在作用域的頂端,但賦值操作不會提升。
2.函數聲明同樣也會提升,這裡僅限於函數聲明,並不包含函數表達式。
3.如果變數名和函數名一樣的話,函數提升優先順序高於變數提升。
4.如果存在兩個函數聲明,則先出現的聲明先提升,後出現的聲明後提升,函數名相同的時候,後提升的會覆蓋先提升的。