**js的變量和其他語言的變量作用域,有很多相同的地方,但也有很多不相同的地方。尤其是變量提升這個概念。之前還真沒聽說過這個概念。**
**先看具體的例子:**
~~~
function test2(){
alert(t);
var t="123"
alert(t);
}
~~~
按照之前的理解,第一個alert就應該出錯。可是在谷歌瀏覽器已測試,沒有錯誤。第一次彈出來的是undefined!!第二次是123,和一般語言里是一樣的。
沒有錯誤,說明t這個變量已經定義,那是不是全局變量呢?
~~~
function test(){
alert(t);
var t="123"
alert(t);
testGlobel();
}
function testGlobel(){
alert(t);
}
~~~
前兩次和之前的一樣,最后一次Uncaught ReferenceError: t is not defined,顯然不是全局變量。
其實這就是變量提升,我的理解是,在函數中使用的任何局部變量,編譯器都會把這些變量放在函數的入口處定義,但賦值還是和編寫代碼時是一樣的,也就是說,局部變量的定義其實是在函數入口處,和我們實際編寫代碼的位置沒有關系。賦值才真正的和我們編寫代碼的位置有關系。
**例如上邊的代碼可以改寫成:**
~~~
function test(){
var t ;
alert(t);
t="123"
alert(t);
testGlobel();
}
~~~
測試最常用的循環計數器和上邊的結果是一樣的,第一次是undefined!第二次是3是循環后的值,第三次是Uncaught? ReferenceError: i is not defined,顯然不是全局變量。
~~~
function test(){
alert(i);
var arr=[4,2,6];
for(var i=0;i<arr.length;i++)
{
}
alert(i);
testGlobel();
}
function testGlobel(){
alert(i);
}
~~~
這個或許才是和其他語言變量作用域的最大區別吧。
- 前言
- js封裝和作用域
- 封裝html的select標簽的js操作
- js正則表達式的使用
- 使用閉包對setTimeout進行簡單封裝
- js中如何復制一個對象,如何獲取所有屬性和屬性對應的值
- js中如何把字符串轉化為對象
- js操作iframe兼容各種瀏覽器
- js模板方法的思路及實現
- 在js中如何實現方法重載?以及函數的參數問題
- 單純的html頁面如何提交,傳遞參數,以及對身份的驗證
- ajax如何調試
- js綜合應用簡單的表格統計
- js格式化貨幣數據
- js綜合應用:表格的四則運算
- 如何在瀏覽器中打開PDF文件并實現預覽的思路與代碼
- js實現幻燈片效果
- js實現幻燈片效果二
- jquery-easyui必填項隱藏問題的處理方案
- jquery-easyui隱藏可用不可用的問題的處理方案
- js變量作用域--變量提升