一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

理解JavaScript變量作用域更輕松

JavaScript本身作為一門簡單的語言,就其變量作用域問題一樣令不少人頭暈,這主要是因為JavaScript閉包的存在。本文不打算深入講解JavaScript變量作用域問題(其實本人也沒有能力能把這一話題講的深入些),也不講“閉包”話題,本文只討論最實用的JavaScript作用域知識點(diǎn)。

一、JavaScript作用域分類
JavaScript就兩種作用域:全局(window)、函數(shù)級(function)。函數(shù)級(function)不要理解為“塊級(大括號{}級)”。

二、區(qū)分及定義JavaScript全局變量與局部變量
1.1定義在所有函數(shù)最外邊,使用或不使用var關(guān)鍵字定義的變量都是全局變量。全局變量其實被解析成window對象的一個屬性,所以我們可以以“window.全局變量名”方式訪問它,推薦在沒有必要的情況下直接使用變量名訪問。如下例子演示了全局變量定義最常見的方法:
復(fù)制代碼 代碼如下:
var msg1='This is message 1';
msg2='This is message 2';
alert(window.msg1); //This is message 1 使用window關(guān)鍵字進(jìn)行訪問
alert(window.msg2); //This is message 2
alert(msg1); //This is message 1 省略window關(guān)鍵字的訪問方式
alert(msg2); //This is message 2
function otherFunction(){} //其它一些函數(shù)或?qū)ο舐暶鞔a
var otherObject={};

1.2在函數(shù)內(nèi)(局部變量運(yùn)行時環(huán)境)一樣可以定義和獲取全局變量。定義的方法就是不使用var關(guān)鍵字,而在局部環(huán)境中亦可輕松獲得全局變量內(nèi)容,直接使用全局變量名引用即可。需要注意的是:如果函數(shù)內(nèi)定義了與全局變量同名的局部變量,那么此時函數(shù)體將優(yōu)先使用自己的局部變量,如果此時你非要使用同名的全局變量,請加上window前綴。舉例如下:
復(fù)制代碼 代碼如下:
var msg1='This is message 1';
var msg3='This is message 3';
function otherFunction()
{
msg2='This is message 2'; //不使用var關(guān)鍵字,其實也是定義一個全局變量
var msg3='Message 3';
alert(msg1); //This is message 1 (函數(shù)內(nèi)當(dāng)然可以訪問到外面定義的全局變量,再深的函數(shù)嵌套一樣能正確獲到這個全局變量,這是JavaScript閉包的其中一種體現(xiàn))
alert(msg3); //Message 3 (局部變量msg3)
alert(window.msg3); //This is message 3 (使用window前綴訪問同名的全局變量msg3)
alert(this.msg3); //This is message 3 (因為otherFunction ()定義在一個全局的環(huán)境中,此時otherFunction ()的this也是指向window,所有你看到window. msg3是等于this. msg3的)
}
otherFunction();
//otherFunction函數(shù)外面定義的msg1和里面定義的msg2依然是全局變量
alert(window.msg1); //This is message 1
alert(window.msg2); //This is message 2

2.1使用var關(guān)鍵字,在函數(shù)體內(nèi)定義的變量是局部變量,此變量能供其下面所有語句塊({})及子函數(shù)使用。這個變量在這個函數(shù)里任何地方都可以訪問到,但卻不能在這個函數(shù)的外面“直接”訪問(閉包允許間接訪問,或代理訪問,此知識點(diǎn)不在本文討論范圍)。舉例如下:
復(fù)制代碼 代碼如下:
function showMsg()
{
if (true)
{
var msg='This is message';
}
alert(msg); //This is message
}
showMsg();
alert(typeof(msg)); //undefiend
//這里在if {}大括號內(nèi)定義的變量msg還能在if外showMsg()內(nèi)訪問到,但在showMsg()外則是無法訪問的

2.2父函數(shù)的變量可以被子函數(shù)訪問,但子函數(shù)的變量卻不能被父函數(shù)訪問,顯然這與我們一開始說的函數(shù)級作用域是相吻合的。這看起來老爸爽快些,兒子吝嗇些。舉例如下:
復(fù)制代碼 代碼如下:
function showMsg()
{
var MsgA='Message A';
this.setMsg=function(msg)
{
var MsgB='Message B';
alert(MsgA); //Message A (子函數(shù)setMsg()可以訪問父函數(shù)showMsg()的局部變量MsgA)
}
alert(MsgB); //MsgB未定義 (在父函數(shù)中不能訪問其子函數(shù)中定義的變量MsgB)
}
var sm=new showMsg();
sm.setMsg('Message string');

三、需要注意的幾個地方及使用技巧
1、為了避免變量混亂或被覆蓋,對于局部變量的定義一定不要忘記加上var關(guān)鍵字(必要時我們要變量使用完后主動釋放它,即“變量名=null”),同時建議把所有變量集中定義在每個函數(shù)體內(nèi)的開頭位置。舉例如下:
復(fù)制代碼 代碼如下:
var msg='Message';
function showMsg()
{
var msg; //這里即使不小心使用了與全局變量一樣的變量名,也不用擔(dān)心覆蓋同名全局變量的問題
var a;
var b;
var c;
for (a=0;a<10;a++){}
this.setMsg=function(){}
}

2、巧用匿名函數(shù),減少命名沖突或變量污染。如下兩段代碼其實實現(xiàn)了相同的功能,而第一段代碼寫法自己可以在那個匿名函數(shù)內(nèi)大膽用自己想用的變量名等,不用擔(dān)心自己定義的變量覆蓋其他人定義或自己其它地方定義的變量。
復(fù)制代碼 代碼如下:
//定義一個匿名函數(shù),然后把代碼丟到這個匿名函數(shù)里面,能有效減少命名沖突或變量污染,這是常見JS框架的做法
(function()
{
var msg='This is message';
alert(msg);
})();
document.write(msg); //msg未定義 (匿名函數(shù)外的其它方法已無法調(diào)用msg這個變量)
//-----------------------------
var msg='This is message';
alert(msg);

3、不建議在無須實例化的函數(shù)內(nèi)使用this代替window去訪問全局變量。一般情況使用this關(guān)鍵字的函數(shù)應(yīng)當(dāng)作為JavaScript類來處理(我喜歡把“cls”作為類名的前綴)。以下函數(shù)如果僅當(dāng)作普通函數(shù)調(diào)用一下,就不應(yīng)該出現(xiàn)this關(guān)鍵字,因為這通常是去操作一個全局變量了。例子:
復(fù)制代碼 代碼如下:
function clsMsg()
{
this.msg='This is default message';
this.showMsg=function()
{
alert(this.msg);
}
}
sMsg=new clsMsg();
sMsg.msg='This is new message';
sMsg.showMsg();

四、相關(guān)知識點(diǎn)指引
理解以下相關(guān)知識點(diǎn)有助于你更好地認(rèn)識JavaScript變量作用域,本文暫不詳述,隨后會以單獨(dú)篇幅來講,敬請關(guān)注。
(1)理解JavaScript“預(yù)解析”
(2)JavaScript閉包

JavaScript技術(shù)理解JavaScript變量作用域更輕松,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲成a人片777777网站 | 亚洲国产视频网 | 亚洲网站一区 | 国产一区二区在免费观看 | 在线一区二区三区 | 欧美极品欧美精品欧美图片 | 日韩六九视频 | 色偷偷91久久综合噜噜噜 | 国产91免费视频 | 天天爽天天乐 | 国产麻豆91网在线看 | 欧美在线看欧美高清视频免费 | 99爱在线视频这里只有精品 | 成人女人a毛片在线看 | 在线精品国内视频秒播 | 四虎在线播放免费永久视频 | 六月丁香深爱六月综合激情 | 免费黄色在线 | 国产成人理在线观看视频 | 伊人第一页 | 中文字幕日产每天更新40 | 色诱久久av | 欧美成人三级伦在线观看 | 五月天婷婷精品视频 | 国产日韩一区二区 | 在线观看91精品国产剧情免费 | 呦呦色 | 五月婷婷免费视频 | 精品久久久久久久一区二区手机版 | 久久天堂视频 | 国内精品久久久久久久999下 | f性欧美 | 伊人草草| 久久一精品| 99久久香蕉国产综合影院 | 成人国产一区 | 法国性xxxxx极品 | 国产精品午夜国产小视频 | 色wwwwww | 国产激情视频趣趣在线观看的 | 国产午夜视频在线观看网站 |