JavaScript中的關鍵字"VAR"使用祥解

來源:互聯網
上載者:User
javascript|關鍵字   都不記得是什麼時候看的JScript的文法教程了,裡面說在聲明變數時忽略var關鍵字是完全合法的。當時也因為覺得JavaScript是loosely-typed的語言,所以var可能真的就是個擺設。但是事實常常又證明想當然的結果是不可靠的。

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

    No.1

<script language="javascript">
var var00 = 0;
document.write(var00 + '<br>');var var01 = 1;
function foo()
{
    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>


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

Results#region Results
No.1
0
undefinedNo.2
0
1No.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。

<script type="text/javascript">
<!--
//這樣寫js的語句塊更好一些:)
-->
</script>

  我想知道是不是.在調用一個函數時,程式執行順序會先檢查函數內部變數中,有沒有關鍵字var. 然後中再根據檢查結果給不同的變數付予不同的範圍和變數值.因為我看到在這三個函數中,var01變數都是在輸出語句之後.

function get_global_var(___name)
{
return eval(___name);
}
function set_global_var(___name,___value)
{
eval(___name+"=___value");
}


var aa=11;
Test();
WScript.Echo(aa);//22

function Test()
{
var aa=33;

WScript.Echo(get_global_var("aa"));//11
set_global_var("aa",22);
WScript.Echo(get_global_var("aa"));//22

WScript.Echo(aa);//33
}

  在上面的例子中this從來就沒有指過Test,而一直都是WScript的執行個體。
  如果我們寫一個語句:var test = new Test(); 這時Test裡的this就是指的Test的一個執行個體了,這個執行個體中如果要使用Global的變數,Lostinet給出的是一個方法。
  不過最簡單還是把global傳入對象,這樣定義Test:
  function Test(global)
  {
    // ...
  }
  然後這樣建立執行個體:var test = new Test(this); 就可以在Test執行個體中使用global的對象和屬性了。

  是不是這樣,在new的執行個體中,this就指執行個體,否則都指WScript?如果這樣的話,換了指令碼引擎,是不是情況又會不同?這個是標準嗎? new constructor[(arguments)];
new 運算子執行下面的任務:
·建立一個沒有成員的對象。
·為那個對象調用建構函式,傳遞一個指標給新建立的對象作為 this 指標。
·然後建構函式根據傳遞給它的參數初始化該對象。

  要注意的是即使當前範圍內沒有調用new,但可能在其父範圍裡是調用了new的,所以“在new的執行個體中,this就指執行個體,否則都指WScript?”,前半句對,而後半句不一定。

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。