js中的var详解
var是js的一個關鍵字,它是用來聲明變量的。
聲明一個變量有兩種方式:
第一種:var num=1。如果在方法中聲明,則為局部變量;如果在全局中聲明,則為全局變量
第二種:num=1。事實上這是對屬性進行賦值操作。首先,它會嘗試在當前作用域鏈(如果在方法中聲明,則當前作用域代表全局作用域和方法局部作用域)中解析num,如果在任何當前作用域鏈中找到num,則會對num屬性進行賦值,如果沒有找到num,他會在全局對象(即當前作用域鏈的最頂層對象,如window對象)中創造num屬性并賦值
注意!它并不是聲明了一個全局變量,而是創建了一個全局對象的屬性
由于變量聲明自帶不可刪除屬性,比較var num=1跟num=1,前者是變量聲明,帶不可刪除屬性,因此無法被刪除;后者為全局變量的一個屬性,因此可以從全局變量中刪除。
變量提升
JavaScript引擎的工作方式是,先解析代碼,獲取所有被聲明的變量,然后再一行一行的運行,這造成的結果,就是所有的變量的聲明語句,都會被提升到代碼的頭部,這就叫做變量提升
示例:
? ? console.log(a);
? ? var a=1;
? ? 以上的語句不會報錯,只是提示undefined。實際的運行過程:
? ? var a;
? ? console.log(a);
? ? a=1;表示變量a已聲明,但還未賦值。但是變量提升只對var命令聲明的變量有效,如果一個變量不是var變量聲明的,就不會發生變量提升,例如以下實例:
? ? console.log(aa);
? ? aa=1;以上代碼將會報錯aa is not defined
與普通變量一樣,js中的function也可看做變量,也存在變量提升的情況:
? ? a();
function a(){
? ? console.log(1);
}
表面上,上面的代碼好像在聲明之前就調用了函數a。但是實際上,由于變量提升,函數a定義部分被提升到了代碼頭部,也就是在調用之前已經聲明了。但是,如果采用賦值語句定義函數,JavaScript就會報錯:
a();
var a=function(){
console.log(1);
}//會報 a is not a function
因為實際運行過程:
var a;
a();
a=function(){
? ? console.log(1);
}//這時候a是個變量,并非function
總結
- 上一篇: JavaScript中let和var区别
- 下一篇: var是什么