看看下面這幾個例子的結果就知道問題了:
這三個例子的執行結果分別是:
Results#region Results
No.1
0
undefined
No.2
0
undefined
No.2
0
1
1
No.3
0
undefined
#endregion
原本JavaScript的變數也是有作用域的,只是它非常的籠統,就分為全域變數和函數變數。在第二個例子中得到0和1,是因為所有的變數都是全域變量,而且那個語句塊總共就定義了兩個變數。而第一個第三的函數外全域變量,確實說明var關鍵字有沒有都沒有關係。而函數內的var關鍵字就很關鍵了,它說明第二個var01是函數內的變量,所以在初始化var01前輸出自然就是'undefined'了。
複製程式碼
程式碼如下:
function get_global_var(___name)
{
return eval(___name);
}
function set_global_var(___name,___value)
(___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(" "));//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?”,前半句對,而後半句不一定。