1. 程式人生 > >函式變數提升易混淆題

函式變數提升易混淆題

1. a='哈哈';         

var a = 5;

console.log(a); 

結果為5 ,var a =5 會在開頭宣告var a ; 之後再是a=‘哈哈’   a=5;

2. var sum;
console.log(sum);
 sum = function(){
    console.log('我是函式表示式');
}
sum();

結果為undefined  '我是函式表示式'

3.  var sum = function(){
    console.log('我是函式表示式方式');
}
sum();//輸出‘我是函式表示式方式’
sum = '哈哈';

sum();//報錯       因為這時候sum已經是字串‘哈哈’   當做函式去呼叫必然報錯

4.sum = '哈哈';
function sum(){
    console.log('我是函式表示式方式');
}
    sum();//報錯      因為自定義函式可變數提升  相當於在第一行是 var sum ; sum=function(){ console.log('.....') };之後再是sum='哈哈'   最後一行是sum()  字串不能被當作函式呼叫   故報錯

5.  var sum;
    sum = 5;
 sum = function (){
    alert(111);
 }
 console.log(sum);
sum();

效果是執行函式顯示alert(....)  之後控制檯顯示函式體  邏輯是一次按順序執行的

6.

var a = 5;

function sum(){

    var a = 3;

    console.log(a);
}

sum();

console.log(a)

結果是 3  5    因為有自定義函式  故變數提升  相當於在第一行就是 var a ; a=function(){....}    之後是a =5;   所以先是函式內部  後是全域性變數

7.

if(true){
    var a = 5;
}
console.log(a);
for (var i = 0; i < 3; i++) {
    
}
console.log(i);// 2    3

因為JS是弱型別語言   所以沒有塊級作用域   這個就不同於自定義函數了  不考慮變數提升   最後一個迴圈是在迴圈體之外  故為3

8.

var a = 5;
function sum(){
    var a = 1;
    console.log(a);
}
sum();
console.log(a);

結果是1  5   因為變數提升  先算函式   之後a的值改變為5   

9.

var a = 5;
function sum(){
    
    console.log(a);
    var a = 1;
}
sum();
console.log(a);

結果是undefined  5   變數提升  先算自定義函式  則先在函式體內算  函式體內  相當於var a ;  之後console.log(a)  再之後是a = 1

所以函式執行起來時  是undefined   再之後是函式體之外的

10.

var a = 5;
function sum(){
    
    console.log(a);
    var a = 1;
    console.log(a);
}
sum();
console.log(a);

結果是5  1   1   執行到函式體內時   先沒有在函式體有定義  則在全域性變數中找   有找到的var  a =5 ;則第一個a取5  之後變為1  在之後在函式體之外   仍然為1   (此題超級有技術含量    小夥伴們多理解)

11.

function a(){
    var a = 2;         
 };
 a();
 console.log(a)

結果顯示 函式體;a()直接跳過   因為裡面只有一個var a =2;   之後相當於自定義函式變數提升;

12.

a=1;
 function a(){
    var a = 2;
    console.log(a)         
         
 };
 console.log(a)

結果顯示 1   這時候函式已經賦值為1

13.

function a(){
    var a = 2;
    console.log(a)         
         
 };
 a();
 console.log(a)    結果顯示2  函式體   前一個2是指呼叫函式  但a本身並不受影響 仍然是函式體;

14.