亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

js變量以及其作用域詳解

 更新時(shí)間:2020年07月18日 22:31:02   投稿:mdxy-dxy  
Javascript和Java、C這些語言不同,它是一種無類型、弱檢測(cè)的語言。它對(duì)變量的定義并不需要聲明變量類型,我們只要通過賦值的形式,可以將各種類型的數(shù)據(jù)賦值給同一個(gè)變量

一、變量的類型

  Javascript和Java、C這些語言不同,它是一種無類型、弱檢測(cè)的語言。它對(duì)變量的定義并不需要聲明變量類型,我們只要通過賦值的形式,可以將各種類型的數(shù)據(jù)賦值給同一個(gè)變量。例如:

i=100;//Number類型
i="variable";//String類型
i={x:4};//Object類型
i=[1,2,3];//Array類型

JS的這種特性雖然讓我們的編碼更加靈活,但也帶來了一個(gè)弊端,不利于Debug,編譯器的弱檢測(cè)讓我們維護(hù)冗長(zhǎng)的代碼時(shí)相當(dāng)痛苦。

二、變量的聲明

  JS中變量申明分顯式申明和隱式申明。
  var i=100;//顯式申明
  i=100;//隱式申明
  在函數(shù)中使用var關(guān)鍵字進(jìn)行顯式申明的變量是做為局部變量,而沒有用var關(guān)鍵字,使用直接賦值方式聲明的是全局變量?! ?
  當(dāng)我們使用訪問一個(gè)沒有聲明的變量時(shí),JS會(huì)報(bào)錯(cuò)。而當(dāng)我們給一個(gè)沒有聲明的變量賦值時(shí),JS不會(huì)報(bào)錯(cuò),相反它會(huì)認(rèn)為我們是要隱式申明一個(gè)全局變量,這一點(diǎn)一定要注意。

三、全局變量和局部變量

  當(dāng)JS解析器執(zhí)行時(shí),首先就會(huì)在執(zhí)行環(huán)境里構(gòu)建一個(gè)全局對(duì)象,我們定義的全局屬性就是做為該對(duì)象的屬性讀取,在頂層代碼中我們使用this關(guān)鍵字和window對(duì)象都可以訪問到它。而函數(shù)體中的局部變量只在函數(shù)執(zhí)行時(shí)生成的調(diào)用對(duì)象中存在,函數(shù)執(zhí)行完畢時(shí)局部變量即刻銷毀。因此在程序設(shè)計(jì)中我們需要考慮如何合理聲明變量,這樣既減小了不必要的內(nèi)存開銷,同時(shí)能很大程度地避免變量重復(fù)定義而覆蓋先前定義的變量所造成的Debug麻煩。

四、變量作用域

  任何程序語言中變量的作用域都是一個(gè)很關(guān)鍵的細(xì)節(jié)。JS中變量的作用域相對(duì)與JAVA、C這類語言顯得更自由,一個(gè)很大的特征就是JS變量沒有塊級(jí)作用域,函數(shù)中的變量在整個(gè)函數(shù)都中有效,運(yùn)行下面代碼:

<SCRIPT LANGUAGE="JavaScript" type="text/javascript"> 
//定義一個(gè)輸出函數(shù) 
function outPut(s){ 
document.writeln(s) 
} 
//全局變量 
var i=0; 
//定義外部函數(shù) 
function outer(){ 
//訪問全局變量 
outPut(i); // 0 
//定義一個(gè)類部函數(shù) 
function inner(){ 
//定義局部變量 
var i = 1; 
// i=1; 如果用隱式申明 那么就覆蓋了全局變量i 
outPut(i); //1 
} 
inner(); 
outPut(i); //0 
} 
outer(); 
</SCRIPT> 

  輸出結(jié)果為0 1 0,從上面就可以證明JS如果用var在函數(shù)體中聲明變量,那么此變量在且只在該函數(shù)體內(nèi)有效,函數(shù)運(yùn)行結(jié)束時(shí),本地變量即可銷毀了。
  由于上面的這個(gè)JS特性,還有一個(gè)關(guān)鍵的問題需要注意。此前一直使用ActionScript,雖然它和JS都是基于ECMA標(biāo)準(zhǔn)的,但在這里還是略有不同的。例如下面代碼:

<SCRIPT LANGUAGE="JavaScript" type="text/javascript"> 
//定義一個(gè)輸出函數(shù) 
function outPut(s){ 
document.writeln(s) 
} 
//全局變量 
var i=0; 
//定義外部函數(shù) 
function outer(){ 
//訪問全局變量 
outPut(i); // 0 
//定義一個(gè)類部函數(shù) 
function inner(){ 
outPut(i); //undefiend 
var i=1; 
outPut(i); //1 
} 
inner(); 
outPut(i); //0 
} 
outer(); 
</SCRIPT> 

  你可能認(rèn)為輸出結(jié)果是0 0 1 0,事實(shí)上在AS中確實(shí)是這樣的,而在JS中的輸入?yún)s是0 undefined 1 0,為何會(huì)這樣了?剛才我們說到了JS函數(shù)體中聲明的本地變量在整個(gè)函數(shù)中都有效,因此在上面代碼中var i = 1 ;在inner函數(shù)中都有效,實(shí)際上顯式聲明的變量i是在預(yù)編譯時(shí)就已經(jīng)編譯到調(diào)用對(duì)象中了,不同于隱式聲明變量在解釋時(shí)才被定義為全局變量,只是在調(diào)用outPut(i)時(shí),還沒有將它初始化變量,此時(shí)的本地變量i是未賦值變量,而不是未定義變量,因此輸出了undefined。上面的代碼等效于下面代碼:

function inner(){ 
var i; //定義但不賦值 
outPut(i); //undefiend 
i=1; 
outPut(i); //1 
}

  為了避免上面的這類問題,因此在函數(shù)開始位置集中做函數(shù)聲明是一個(gè)極力推薦的做法。

五、基本類型和引用類型

  JS不同于JAVA、C這些語言,在變量申明時(shí)并不需要聲明變量的存儲(chǔ)空間。變量中所存儲(chǔ)的數(shù)據(jù)可以分為兩類:基本類型和引用類型。其中數(shù)值、布爾值、null和undefined屬于基本類型,對(duì)象、數(shù)組和函數(shù)屬于引用類型。
  基本類型在內(nèi)存中具有固定的內(nèi)存大小。例如:數(shù)值型在內(nèi)存中占有八個(gè)字節(jié),布爾值只占有一個(gè)字節(jié)。對(duì)于引用型數(shù)據(jù),他們可以具有任意長(zhǎng)度,因此他們的內(nèi)存大小是不定的,因此變量中存儲(chǔ)的實(shí)際上是對(duì)此數(shù)據(jù)的引用,通常是內(nèi)存地址或者指針,通過它們我們可以找到這個(gè)數(shù)據(jù)。
  引用類型和基本類型在使用行為上也有不同之處:

<SCRIPT LANGUAGE="JavaScript" type="text/javascript"> 
//定義一個(gè)輸出函數(shù) 
function outPut(s){ 
document.writeln(s) 
} 
var a = 3; 
var b = a; 
outPut(b); 
//3 
a = 4; 
outPut(a); 
//4 
outPut(b); 
//3 
</SCRIPT> 

  對(duì)基本類型b進(jìn)行賦值時(shí),實(shí)際上是又開辟了一塊內(nèi)存空間,因此改變變量a的值對(duì)變量b沒有任何影響。

<SCRIPT LANGUAGE="JavaScript" type="text/javascript"> 
//定義一個(gè)輸出函數(shù) 
function outPut(s){ 
document.writeln(s) 
} 
var a_array = [1,2,3]; 
var b_array = a_array; 
outPut(b_array); //1,2,3 
a_array[3] = 4; 
outPut(b_array);//1,2,3,4 
</SCRIPT> 

上面是對(duì)引用類型的變量賦值,實(shí)際上他們傳遞的是對(duì)內(nèi)存地址的引用,因此對(duì)a_array和b_array的存取,實(shí)際上都是操作的同一塊內(nèi)存區(qū)域。如果希望重新分配內(nèi)存空間存儲(chǔ)引用型變量,那么我就需要使用克隆方法或者自定義方法來復(fù)制引用變量的數(shù)據(jù)。

JS變量作用域

<script language ="javascript" type ="text/javascript" > 
var a = "change"; 
function fun() { 
alert(a);//輸出undefined 
var a = "改變了"; 
alert(a);//輸出改變了 
} 
alert(a);//輸出change 
fun(); 
</script> 

var定義的是一個(gè)作用域上的變量,在第一次輸出a之前,JS在預(yù)編譯分析中已經(jīng)將a賦值為change,所以第一次輸出change,當(dāng)調(diào)用到fun()函數(shù)的時(shí)候,JS創(chuàng)建一個(gè)新的作用域,在輸出a之前,初始化所有var變量的值為undefined,所以fun()中第一次輸出的是undefined,第二次輸出已經(jīng)給a賦值了,所以輸出新的值;兩個(gè)a在函數(shù)里面和外面是不同的兩個(gè)變量,如:

<script language ="javascript" type ="text/javascript" > 
var b; 
function fun() { 
b = "change"; 
} 
alert(b);//輸出undefined 
</script> 

變量b在函數(shù)外面已經(jīng)定義了,在函數(shù)中有給b賦值,但輸出的卻是undefined。

相關(guān)文章

最新評(píng)論