JavaScript中的關(guān)鍵字"VAR"使用詳解 分享
更新時(shí)間:2013年07月31日 10:26:00 作者:
JScript的語法教程里面說在聲明變量時(shí)忽略var關(guān)鍵字是完全合法的。但是事實(shí)常常又證明想當(dāng)然的結(jié)果是不可靠的。
看看下面這幾個(gè)例子的結(jié)果就知道問題了:
這三個(gè)例子的執(zhí)行結(jié)果分別是:
Results#region Results
No.1
0
undefined
No.2
0
1
No.3
0
undefined
#endregion
原來JavaScript的變量也是有作用域的,只是它非常的籠統(tǒng),就分為全局變量和函數(shù)變量。在第二個(gè)例子中得到0和1,是因?yàn)樗械淖兞慷际侨肿兞?,而且那個(gè)語句塊一共就定義了兩個(gè)變量。而第一個(gè)第三的函數(shù)外全局變量,確實(shí)說明var關(guān)鍵字有沒有都沒有關(guān)系。而函數(shù)內(nèi)的var關(guān)鍵字就很關(guān)鍵了,它說明第二個(gè)var01是函數(shù)內(nèi)的變量,所以在初始化var01前輸出自然就是'undefined'了。
那么函數(shù)里面是不是就屏蔽掉了全局的var01了呢?我們知道在C/C++可以使用::去訪問全局變量,那么JavaScript可不可以呢?這里其實(shí)我們只要明白了全局變量到底是什么東西,就好弄了。原來全局變量都是動(dòng)態(tài)添加到Window對(duì)象的實(shí)例window上的屬性而以,所以我們只要在函數(shù)內(nèi)用:document.write(window.var01);就可以取到其值1了。同時(shí)在這個(gè)上下文中,function內(nèi)的this也是指向的window實(shí)例,我們也可以把引用寫成:this.var01。
順便說一下,重看JScript教程時(shí),它說變量只能是[a-zA-Z_]+[a-zA-Z0-9_]*格式,可是'$'卻也可以作為變量名字符,而且還可以用在開頭,比如:$1234,更甚至于:$$$ 也是合法的變量名,faint。
我想知道是不是.在調(diào)用一個(gè)函數(shù)時(shí),程序執(zhí)行順序會(huì)先檢查函數(shù)內(nèi)部變量中,有沒有關(guān)鍵字var. 然后中再根據(jù)檢查結(jié)果給不同的變量付予不同的作用域和變量值.因?yàn)槲铱吹皆谶@三個(gè)函數(shù)中,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的實(shí)例。
如果我們寫一個(gè)語句:var test = new Test(); 這時(shí)Test里的this就是指的Test的一個(gè)實(shí)例了,這個(gè)實(shí)例中如果要使用Global的變量,Lostinet給出的是一個(gè)方法。
不過最簡(jiǎn)單還是把global傳入對(duì)象,這樣定義Test:
function Test(global)
{
// ...
}
然后這樣創(chuàng)建實(shí)例:var test = new Test(this); 就可以在Test實(shí)例中使用global的對(duì)象和屬性了。
是不是這樣,在new的實(shí)例中,this就指實(shí)例,否則都指WScript?如果這樣的話,換了腳本引擎,是不是情況又會(huì)不同?這個(gè)是標(biāo)準(zhǔn)嗎?
new constructor[(arguments)];
new 運(yùn)算符執(zhí)行下面的任務(wù):
·創(chuàng)建一個(gè)沒有成員的對(duì)象。
·為那個(gè)對(duì)象調(diào)用構(gòu)造函數(shù),傳遞一個(gè)指針給新創(chuàng)建的對(duì)象作為 this 指針。
·然后構(gòu)造函數(shù)根據(jù)傳遞給它的參數(shù)初始化該對(duì)象。
要注意的是即使當(dāng)前作用域內(nèi)沒有調(diào)用new,但可能在其父作用域里是調(diào)用了new的,所以“在new的實(shí)例中,this就指實(shí)例,否則都指WScript?”,前半句對(duì),而后半句不一定。
這三個(gè)例子的執(zhí)行結(jié)果分別是:
復(fù)制代碼 代碼如下:
Results#region Results
No.1
0
undefined
No.2
0
1
No.3
0
undefined
#endregion
原來JavaScript的變量也是有作用域的,只是它非常的籠統(tǒng),就分為全局變量和函數(shù)變量。在第二個(gè)例子中得到0和1,是因?yàn)樗械淖兞慷际侨肿兞?,而且那個(gè)語句塊一共就定義了兩個(gè)變量。而第一個(gè)第三的函數(shù)外全局變量,確實(shí)說明var關(guān)鍵字有沒有都沒有關(guān)系。而函數(shù)內(nèi)的var關(guān)鍵字就很關(guān)鍵了,它說明第二個(gè)var01是函數(shù)內(nèi)的變量,所以在初始化var01前輸出自然就是'undefined'了。
那么函數(shù)里面是不是就屏蔽掉了全局的var01了呢?我們知道在C/C++可以使用::去訪問全局變量,那么JavaScript可不可以呢?這里其實(shí)我們只要明白了全局變量到底是什么東西,就好弄了。原來全局變量都是動(dòng)態(tài)添加到Window對(duì)象的實(shí)例window上的屬性而以,所以我們只要在函數(shù)內(nèi)用:document.write(window.var01);就可以取到其值1了。同時(shí)在這個(gè)上下文中,function內(nèi)的this也是指向的window實(shí)例,我們也可以把引用寫成:this.var01。
順便說一下,重看JScript教程時(shí),它說變量只能是[a-zA-Z_]+[a-zA-Z0-9_]*格式,可是'$'卻也可以作為變量名字符,而且還可以用在開頭,比如:$1234,更甚至于:$$$ 也是合法的變量名,faint。
我想知道是不是.在調(diào)用一個(gè)函數(shù)時(shí),程序執(zhí)行順序會(huì)先檢查函數(shù)內(nèi)部變量中,有沒有關(guān)鍵字var. 然后中再根據(jù)檢查結(jié)果給不同的變量付予不同的作用域和變量值.因?yàn)槲铱吹皆谶@三個(gè)函數(shù)中,var01變量都是在輸出語句之后.
復(fù)制代碼 代碼如下:
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的實(shí)例。
如果我們寫一個(gè)語句:var test = new Test(); 這時(shí)Test里的this就是指的Test的一個(gè)實(shí)例了,這個(gè)實(shí)例中如果要使用Global的變量,Lostinet給出的是一個(gè)方法。
不過最簡(jiǎn)單還是把global傳入對(duì)象,這樣定義Test:
復(fù)制代碼 代碼如下:
function Test(global)
{
// ...
}
然后這樣創(chuàng)建實(shí)例:var test = new Test(this); 就可以在Test實(shí)例中使用global的對(duì)象和屬性了。
是不是這樣,在new的實(shí)例中,this就指實(shí)例,否則都指WScript?如果這樣的話,換了腳本引擎,是不是情況又會(huì)不同?這個(gè)是標(biāo)準(zhǔn)嗎?
new constructor[(arguments)];
new 運(yùn)算符執(zhí)行下面的任務(wù):
·創(chuàng)建一個(gè)沒有成員的對(duì)象。
·為那個(gè)對(duì)象調(diào)用構(gòu)造函數(shù),傳遞一個(gè)指針給新創(chuàng)建的對(duì)象作為 this 指針。
·然后構(gòu)造函數(shù)根據(jù)傳遞給它的參數(shù)初始化該對(duì)象。
要注意的是即使當(dāng)前作用域內(nèi)沒有調(diào)用new,但可能在其父作用域里是調(diào)用了new的,所以“在new的實(shí)例中,this就指實(shí)例,否則都指WScript?”,前半句對(duì),而后半句不一定。
您可能感興趣的文章:
- javascript定義變量時(shí)帶var與不帶var的區(qū)別分析
- javascript定義變量時(shí)加var與不加var的區(qū)別
- JavaScript聲明變量時(shí)為什么要加var關(guān)鍵字
- JavaScript中變量聲明有var和沒var的區(qū)別示例介紹
- 淺談JavaScript中定義變量時(shí)有無var聲明的區(qū)別
- javascript定義變量時(shí)有var和沒有var的區(qū)別探討
- JavaScript var聲明變量背后的原理示例解析
- Javascript var變量隱式聲明方法
- var與Javascript變量隱式聲明
- javascript中var的重要性分析
相關(guān)文章
JavaScript中各數(shù)制轉(zhuǎn)換全面總結(jié)
這篇文章主要介紹了JavaScript中各數(shù)制轉(zhuǎn)換,利用toString的基模式來進(jìn)行轉(zhuǎn)換,對(duì)數(shù)字調(diào)用 toString(10) 與調(diào)用 toString() 它們返回的區(qū)別和相同之處等等都在本文中提及,具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。2017-08-08
Javascript標(biāo)準(zhǔn)DOM Range操作全集
Javascript標(biāo)準(zhǔn)DOM Range操作全集...2007-01-01
深入解讀JavaScript中的Iterator和for-of循環(huán)
這篇文章主要介紹了JavaScript中的Iterator和for-of循環(huán),是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-07-07
javascript數(shù)組去重方法總結(jié)(推薦)
這篇文章主要介紹了javascript數(shù)組去重方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03

