1. 程式人生 > >js中變數宣告與變數提前

js中變數宣告與變數提前

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訪問不到在函式中宣告的變數,這就是閉包;