鍍金池/ 問答/HTML/ Javascript基礎知識

Javascript基礎知識

var a = 1;

function foo() {
    if (!a) {
        var a = 2;
    }
    alert(a);
};

foo(); //2

解釋器分析代碼為:

var a;
a = 1;

function foo() {
    var a;     
    if (!a) {
        a = 2;
    }
    alert(a);     // 此時的 a 并非函數(shù)體外的那個全局變量
}

a=2;并不等價于

var a;
a=2;

為什么foo()函數(shù)里會有一個 var a;

回答
編輯回答
情皺

函數(shù)在執(zhí)行前會預解析,var的變量會提到函數(shù)內頂部

2018年3月22日 21:48
編輯回答
尛曖昧

變量聲明提升(變量賦值并不會提升)
用var聲明變量不管是在哪里都相當于在頂部(函數(shù)內有局部作用域所以在函數(shù)內var相當于在函數(shù)的第一行聲明)

alert(a)//undefined
function x(){
    alert(a)//undefined
    var a = 5;
     alert(a)//5
    function y(){
        alert(a)//undefined
        var a = 7;
        alert(a)//7
    }
}
var a = 1;
alert(a)//1

都等價于

var a,b;
alert(a)//undefined
function x(){
    var a,b;
    alert(a)//undefined
    a = 5;
    alert(a)//5
    function y(){
        var a;
        alert(a)//undefined
        a = 7;
        alert(a)//7
    }
}
a = 1;
alert(a)//1

js只有在函數(shù)內才有局部作用域
所以在函數(shù)內任何地方聲明都是相當于在第一行聲明
函數(shù)內是一個獨立的作用域 函數(shù)內的變量會先在局部內找(函數(shù)內) 函數(shù)內沒有才會繼續(xù)向外找


//此函數(shù)可以在局部找到聲明提前的a
function foo(){
    var a,b,c;
    if(!a){//a聲明但為被定義 所以為undefined,!undefined為true通過if對a賦值 并彈出a
        a = 2;
    }
    
    var b = 1;
    alert(a)
}

關于作用域

var a =1;//這是在widow的作用域也就是全局內聲明

function foo(){
    var a = 2;//這是在函數(shù)內聲明
    alert(a)//因為尋找變量是從內向外找這里直接在內部就有a所以不用繼續(xù)向外找
}
alert(a)//因為尋找變量是從內向外找這已經(jīng)是最外層所以輸出1 
//在外部是獲取不到局部內的變量的除非用閉包
2017年10月28日 00:37
編輯回答
柒槿年

我談下我的理解,函數(shù)的變量作用域是函數(shù)級的,
`if (!a) {

 var a = 2;;

}`
這一塊不管 !a 取到的 布爾值 是否為真,程序都會找到 var 聲明的 a,進行變量提升,也就是 var a;因為 a 聲明了,未賦值,因此是 undefined,取反剛好是 true,然后 a 重新賦值為 2 ,所以打印出來的就是 2

2018年6月27日 09:47