js中變數宣告與變數提前
阿新 • • 發佈:2018-11-19
js中變數宣告與變數提前
變數宣告:通過var表明變數的型別與名字,但並未賦值,如 var a;
變數初始化:即為a賦值,如 a=1;
使用變數步驟:a.宣告–>b.賦值–>3.呼叫
使用方法
// 方式一:宣告和賦值不分離
var str = "宣告和賦值不分離";
console.log(str); //結果:宣告和賦值不分離
// 方式二:宣告和賦值分離
var str2;
str2 = "宣告和賦值分離";
console.log(str2); //結果:宣告和賦值分離
注意:在同一作用域中,變數的名字只能使用一次(不能重複宣告同一個變數),但可以為同一個變數賦值,後面賦的值會覆蓋前面的,如;
//變數宣告並初始化
var num = 1;
console.log(num); //結果:1
// 同一變數重新賦值,後面的值會覆蓋前面的
num = 3;
console.log(num); //結果:3
變數宣告提前
變數宣告提前,僅僅是將宣告提前了,但未賦值,舉個例子:
console.log(a);
var a=1;
輸出的結果是undefined,原因是變數宣告提前,可以將程式碼理解為:
var a;//只聲明瞭變數未賦值
console.log(a);//結果為undefined;
a=1;
再來看個例子
var a=1;
console. log(a);//結果為1
function b(){
console.log(a);//結果為undefined;
var a=2;
console.log(a);//結果為2;
}
b();
為什麼第二個a的結果是undefined?原因也是變數宣告提前,程式碼相當於:
var a=1;
console.log(a);//結果為1
function b(){
var a;
console.log(a);//結果為undefined;
a=2;
console.log(a);//結果為2;
}
b();
但如果將var a=2刪掉,console.log(a)會從函式內部往上一層層找,輸出的結果就是1,此時的a是全域性變數;
再來看一個例子:
var a=1;
function b(){
a=10;
return;
}
b();
console.log(a);//結果為10;
///////////////////////////
var a=1;
function b(){
a=10;
return;
function a(){}
}
b();
console.log(a);//結果為1
第一個程式碼結果為10很好理解,但第二個為什麼是1呢?因為裡面寫了個function a函式宣告會提前,相當於在區域性又聲明瞭一個a就影響不到全域性的a;看程式碼:
var a=1;
function b(){
var a=function (){};
a=10;
return;
}
b();
console.log(a);
函式外面的a訪問不到在函式中宣告的變數,這就是閉包;