1. 程式人生 > 實用技巧 >第4章提升

第4章提升


a = 2;
var a;
console.log(a);//輸出的是2


// 它等價於
var a;
a=2;
console.log(a);//2
================

console.log(a)
var a=2;//輸出undefined


等價於
var a;
console.log(a)
a=2;

因為var具有提升;
提升:在預編譯階段,編譯器會把所有定義的變數提升到最頂部,但是值還是保留在原來的位置上;

foo();
function foo(){
    console.log(a);//輸出undefined
    var a=2;
}


等價於
function foo(){
    var a;
    console.log(a);//輸出undefined
    a=2;
}
foo();

說明了函式宣告,和var 宣告的變數都有提升;
foo();
var foo=function bar(){
    //do something()
}

因為這是一個函式表示式;函式表示式不會被提升,所以會報錯;
函式宣告和變數宣告都會被提升,但是函式會首先被提升,然後才是變數

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

等價於
function foo(){
    console.log(1);   
}
foo(); //輸出1
var foo;
foo=function(){
    console.log(2);
}
var a = 10;
function a() {};
console.log(typeof a);//number

    它等價於
function a() {};
var a = 10;
console.log(typeof a);//number
因為:函式宣告和變數宣告都會被提升,但是函式會首先被提升,然後才是變數
console.log(a);    //f a(){console.log('hi');}
console.log(b);    //undefined
function a() {
  console.log('hi');  
}
var b = function() {
  console.log('ok');  
}


它等價於
function a() {
  console.log('hi');  
}
var b;//undefined;
console.log(a);    //f a(){console.log('hi');}
console.log(b);    //undefined
b = function() {
  console.log('ok');  
}

記住預編譯
二者優先順序:函式提升會優先於變數提升,而且不會被同名的變數覆蓋.
但是,如果這個同名變數已經賦值了,那函式變數就會被覆蓋。
當二者同時存在時,會先指向函式宣告。


console.log(a);    //f a() {...}
console.log(a());    //2
var a = 1;
function a() {
  console.log(2);  
}
console.log(a);    //1
a = 3;
console.log(a());    //報錯,現在的函式a已經被賦值過後的變數a給覆蓋了,無法再呼叫a()

    等價於
function a() {
  console.log(2);  
}
var a;
console.log(a);    //f a() {...}
console.log(a());    //2
a = 1; //同名變數已經賦值了,那函式變數就會被覆蓋。
console.log(a);    //1
a = 3;
console.log(a());    //報錯,現在的函式a已經被賦值過後的變數a給覆蓋了,無法再呼叫a()


在讀第4章的時候,提升這一章的時候,我就比上一章好些,很多地方都懂,
淡然這一章節一點都不難,我之前也很清楚這一章。
但是還有一個地方不是特別的懂!

參考的地址
https://blog.csdn.net/sunlizhen/article/details/99844964
https://www.cnblogs.com/hey-Sarah/p/13449699.html