·變量聲明提升
--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(); //調用階段,函數表達式以執行順序排到最後,覆蓋之前的所有
//寫在最後,可以得出 創建變量和函數表達式的方式,只要執行順序在上面的,都可以看作是申明階段,採取函數忽略變量原則,而在變量之後的,按執行順序執行