js變數和作用域

2021-07-05 21:34:50 字數 2358 閱讀 7229

一:變數型別

i=100;//number型別

i="abc";//string型別

i=;//object型別

i=[1,2,3];//array型別

二:變數宣告

var i=100;//顯示宣告

i=100;//隱示宣告

在函式內部使用var關鍵字宣告的變數為區域性變數

;沒有使用var關鍵字,直接賦值宣告的是全域性變數

當我們使用訪問乙個沒有宣告的變數時,js會報錯。而當我們給乙個沒有宣告的變數賦值時,js不會報錯,相反它會認為我們是要隱式宣告乙個全域性變數,這一點一定要注意。如下圖沒有宣告school,使用時會報錯,但是沒有通過var 宣告時,認為是隱式宣告的乙個全域性變數,

三:全域性變數和區域性變數

當js解析器執行時,首先會在執行環境裡構建乙個全域性物件,我們定義的全域性屬性就是作為該物件的屬性,在頂層**中我們使用this關鍵字和window物件都可以訪問到它。而函式體中的區域性變數只在函式執行時生成的呼叫物件中存在,函式執行完畢時區域性變數即可銷毀。因此在程式設計中我們需要考慮如何合理宣告變數,這樣既減小不必要的記憶體開銷,同時能很大程度的避免變數重複定義二覆蓋先前定義的變數所造成的debug麻煩

四:變數作用域

js變數沒有塊級作用域,函式中的變數在整個函式都有效

輸出結果:0 1 0,從上面就可以證明js如果用var在函式體中宣告變數,那麼此變數在且只在該函式體內有效,函式執行結束時,本地變數即可銷毀了。

由於上面的這個js特性,還有乙個關鍵的問題需要注意。此前一直使用actionscript,雖然它和js都是基於ecma標準的,但在這裡還是略有不同。如下面**:

你可能認為輸出結果是:0 0 1 0,事實上在as中確實是這樣的,而在js中的輸入卻是0 undefined 1 0,為何會這樣了?剛才我們說到了js函式體中宣告的本地變數在整個函式中都有效,因此上面**中var i = 1;在inner函式中都有效,實際上顯示宣告的變數i是在預編譯時就已經編譯到呼叫物件中了,不同於隱式宣告變數在解釋時才被定義為全域性變數,只是在呼叫output(i)時,還沒有將它初始化變數,此時的本地變數i是為賦值變數,而不是未定義變數,因此輸出了undefined

五:基本型別和引用型別

基本型別在記憶體中具有固定的記憶體大小。例如:數值型在記憶體中占有八個位元組,布林值只占有乙個位元組。對於引用型別,他們可以具有任意長度,因此他們的記憶體大小時不定的,因此變數中儲存的實際上是對此資料的引用,通常是記憶體位址或者指標。對基本型別b進行賦值時,實際上時又開闢了一塊記憶體空間,因此改變變數a的值對變數b沒有任何影響

$(function()

var a =3;

var b =a;

var c=b;

output(b);//3

output(c);//3

a=4;

output(a);//4

output(b);//3

b=5;

output(b);//5

output(c);//3

});

$(function()

var a_array =[1,2,3];

var b_array = a_array;//相當於a_array和b_array兩個引用都指向同乙個記憶體位址

output(b_array);//1,2,3

a_array[3]=4;//修改了a_array和b_array兩個引用指向的記憶體位址裡的值

output(b_array);//1,2,3,4

});

上面是對引用型別的變數賦值,實際上他們傳遞的是對記憶體位址的引用,因此對a_array和b_array 的訪問,實際上都是操作的同一塊記憶體區域。如果希望重新分配記憶體空間儲存引用型變數,那麼我就需要使用轉殖方法或者自定義方法來複製引用變數的資料。

var定義的是乙個作用域上的變數,在第一次輸出a之前,js在預編譯分析中已經將a賦值為change。所以第一次輸出change,當呼叫到fun()函式的時候,js建立乙個新的作用域,在輸出a之前,初始化所有var變數的值為undefined,所以fun()中第一次輸出的是undefined,第二次輸出已經給a賦值了,所以輸出新的值;兩個a在函式裡面和外面是不同的兩個變數

六:變數刪除

用var定義的全域性變數不能用delete刪除

隱式申明的全域性變數能用delete刪除

js變數和作用域

2.變數值的比較 3.引數的傳遞 4.型別檢測 二 js變數的作用域與解析 基本資料型別 基本資料型別的值不能被修改,其值儲存在棧中,當變數賦予新的值,棧中的值被覆蓋 引用資料型別 引用資料型別的值可以被修改,其位址儲存在棧中,值儲存在堆中棧堆 基本資料型別a值 引用資料型別 b位址1 位址1c 位...

js變數和作用域

js識別符號可以包含字母 下劃線 美元符 和數字,不能以數字開頭 使用關鍵字作為識別符號在大多數瀏覽器會導致 identifier expected 缺少識別符號 錯誤,保留字則會看具體的瀏覽器是否會報錯。所以也不要用關鍵字和保留字作為識別符號。js區分大小寫,如 y 和 y 是不同的變數 向變數分...

JS變數和作用域

1.變數資料型別和堆疊 1.1 資料型別 1 基本資料型別 數字 字串 布林值 undefined null 2 引用資料型別 物件 陣列 函式 1.2 堆疊 1 基本資料型別的值不能被修改,其值儲存在棧中,當變數賦予新的值,棧中的值被覆蓋。2 引用資料型別的值可以被修改,其位址儲存在棧中,值儲存在...