搞懂變量聲明提升

·變量聲明提升

--let const

function aa() {
    console.log(x)   
    let x = '2';
};
aa();
初始化之前無法使用變量

此時,可以證明let 是沒有變量提升的嗎?NO NO NO ~

來看下一個例子

function aa() {
    console.log(x) 
    var x= '1'  
    let x = '2';
};
aa();
此時控制檯報錯,X已經被聲明過了,此時可以證明,let是存在變量聲明提升的。

·關於 function的聲明,先聲明的會被覆蓋

function test() {
    a();
    function a() {
        console.log('1')
    }
    function a() {
        console.log('2')
    }
 }
 test();
//2

對於同名的函數聲明和變量聲明,採用的是忽略原則,由於在提升時函數聲明會提升到變量聲明之前,變量聲明一定會被忽略,所以結果是函數聲明有效

function test1() {
    console.log(typeof a);>>function  //聲明階段:函數式聲明忽略字面量聲明
    var a = '111';
    function a() {
        console.log(11)
    }
  console.log(typeof a);>>string //調用階段:函數式聲明提升,隨後被字面量聲明覆蓋
}
test1();  




//先聲明函數後聲明變量,證明上邊的例子不是function覆蓋了變量
function test2() {
    console.log(typeof a);
    function a() {
        
    }
    var a = '111';
}
test2()


// funct

·函數聲明優先於函數表達式

var getName = function() {
  console.log(1)
}
function getName() {
  console.log(2)
}
getName()
//1
優先聲明函數,然後再被函數表達式覆蓋

 

·函數聲明聲明,立即可用

console.log(getName())
function getName() {
  console.log(2)
}
//>>2


函數表達式不可用
console.log(getName())
var getName=function(){
  console.log(2)
}
//>>getName is not a function

·同名聲明,函數式聲明VS字面量聲明變量 ---函數VS變量

   console.log(getname)//>>>function 聲明階段: 函數聲明會忽略字面量聲明的變量
        var getname='john'
        function getname(){
            console.log('mary')
        }


console.log(getname())>>>john  //調用階段:函數聲明優先,隨後被字面量聲明覆蓋

·同名聲明,函數式聲明函數VS函數表達式 ---函數VS函數

     console.log(getname())>>>mary //聲明階段:函數聲明會忽略函數表達式
        var getname=function(){
            console.log('john')
        }
        function getname(){
            console.log('mary')
        }
 console.log(getname())>>john  //調用階段:函數式聲明優先,隨後被函數表達式

·變量VS函數VS函數表達式    >>聲明階段函數會忽略其他   >>調用階段函數表達式纔會賦值和覆蓋

test();>>//’函數‘---函數可以直接調用,而調用階段,同名函數會忽略其他聲明
console.log(test); //  function test(){console.log("函數"); }聲明階段, 同名函數會忽略其他聲明
function test() {
    console.log("函數");  
}
console.log(test);  //  function test(){console.log("函數"); } //聲明階段,同名函數會忽略其他聲明
var test = "變量";
console.log(test);  //"變量"  此時test已經被賦值
var test = function(params) {
    console.log("函數表達式");
};
console.log(test);    //"函數表達式",此時test已經被函數表達式覆蓋
test();               //調用階段,函數表達式以執行順序排到最後,覆蓋之前的所有
 

 

//寫在最後,可以得出  創建變量和函數表達式的方式,只要執行順序在上面的,都可以看作是申明階段,採取函數忽略變量原則,而在變量之後的,按執行順序執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章