JS中VAR的用處(局部變量要用var來聲明,全局變量不加var)

都不記得是什麼時候看的JScript的語法教程了,裏面說在聲明變量時忽略var關鍵字是完全合法的。當時也因爲覺得JavaScript是loosely-typed的語言,所以var可能真的就是個擺設。但是事實常常又證明想當然的結果是不可靠的

    看看下面這幾個例子的結果就知道問題了:

    No.1

<script language="javascript">
var var00 = 0;
document.write(var00 
+ '<br>');

var var01 = 1;
function foo()
{     
               //雖然是定義var01並同時初時話,但var01在整個函數內部都是有作用的,故相當於先聲明,後初始化。
    document.write(var01);          
    
var var01 = 1;
}

foo();
</script>


    No.2

<script language="javascript">
var00 
= 0;
document.write(var00 
+ '<br>');

var01 
= 1;
function foo()
{
    document.write(var01); 
    var01 
= 1;
}

foo();
</script>


    No.3

<script language="javascript">
var00 
= 0;
document.write(var00 
+ '<br>');

var01 
= 1;
function foo()
{
    document.write(var01); 
    
var var01 = 1;
}

foo();
</script>


    這三個例子的執行結果分別是:

#region Results
No.
1
0
undefined

No.
2
0
1

No.
3
0
undefined
#endregion

     原來JavaScript的變量也是有作用域的,只是它非常的籠統,就分爲全局變量和函數變量。在第二個例子中得到0和1,是因爲所有的變量都是全局變量,而且那個語句塊一共就定義了兩個變量。而第一個第三的函數外全局變量,確實說明var關鍵字有沒有都沒有關係。而函數內的var關鍵字就很關鍵了,它說明第二個var01是函數內的變量,所以在初始化var01前輸出自然就是'undefined'了。

     那麼函數裏面是不是就屏蔽掉了全局的var01了呢?我們知道在C/C++可以使用::去訪問全局變量,那麼JavaScript可不可以呢?這裏其實我們只要明白了全局變量到底是什麼東西,就好弄了。原來全局變量都是動態添加到Window對象的實例window上的屬性而以,所以我們只要在函數內用:document.write(window.var01);就可以取到其值1了。同時在這個上下文中,function內的this也是指向的window實例,我們也可以把引用寫成:this.var01。

    By the way, 重看JScript教程時,它說變量只能是[a-zA-Z_]+[a-zA-Z0-9_]*格式,可是'$'卻也可以作爲變量名字符,而且還可以用在開頭,比如:$1234,更甚至於:$$$ 也是合法的變量名,faint。




發佈了24 篇原創文章 · 獲贊 11 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章