JavaScript變量類型以及變量作用域詳解
變量類型
ECMAScript變量可能包含兩種不同類型的數(shù)據(jù)值:基本類型和引用類型。
基本類型
基本類型指的是簡單的數(shù)據(jù)段,5種基本數(shù)據(jù)類型:undefined、null、boolean、number、string,基本數(shù)據(jù)類型是按值訪問的,因此可以操作保存在變量中的實際的值。
復(fù)制變量值
從一個變量向另一個變量復(fù)制基本類型的值,會在變量對象上創(chuàng)建一個新值,然后把該值復(fù)制到為新變量分配的位置上。例如:
var num1 = 5; var num2 = num1;
復(fù)制前的變量對象
復(fù)制后的變量對象
引用類型
引用類型指那些可能由多個值構(gòu)成的對象,引用類型的值是保存在內(nèi)存中的對象,JavaScript不允許直接訪問內(nèi)存中的位置,在操作對象時,實際上是在操作對象的引用而不是實際的對象,因此,引用類型的值是按引用訪問的。
動態(tài)屬性
引用類型的值,我們可以為其添加屬性和方法,也可以改變和刪除其屬性和方法。如果對象不被銷毀或者這個屬性不被刪除,則這個屬性將一直存在,但是我們不能給基本類型的值添加屬性。例如:
var person = new Object(); person.say = "hello"; alert(person.say); //"hello"
復(fù)制變量值
從一個變量向另一個變量復(fù)制引用類型的值時,也會將存儲在變量對象中的值復(fù)制一份放到為新變量分配的空間中,這個值的副本實際上是一個指針,而這個指針指向存儲在堆中的一個對象。復(fù)制結(jié)束后,兩個變量實際上將引用同一個對象,改變其中一個變量,就會影響另一個變量。例如:
var obj1 = new Object(); var obj2 = obj1; obj1.say = "hello"; alert(obj2.say); //"hello"
傳遞參數(shù)
ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的,把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù)。在向參數(shù)傳遞基本類型的值時,被傳遞的值會被復(fù)制給一個局部變量;在向參數(shù)傳遞引用類型的值時,會把這個值在內(nèi)存中的地址復(fù)制給一個局部變量,因此這個局部變量的變化會反映在函數(shù)的外部。例如:
function addTen(num) { num += 10; return num; } var count = 20; var result = addTen(count); alert(count); //20 alert(result); //30
執(zhí)行環(huán)境及作用域
執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了他們各自的行為。
全局執(zhí)行環(huán)境是最外圍的執(zhí)行環(huán)境,在WEB瀏覽器中,全局執(zhí)行環(huán)境被認為是window對象,因此全局變量和屬性都是作為window的屬性和方法創(chuàng)建的。
每個函數(shù)都有自己的執(zhí)行環(huán)境,當(dāng)執(zhí)行流進入一個函數(shù)時,函數(shù)的環(huán)境就會被推入一個環(huán)境棧中,在函數(shù)執(zhí)行之后,棧將其彈出,將控制權(quán)返回給之前的執(zhí)行環(huán)境。
當(dāng)代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈,作用域鏈的用途是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。作用域鏈的前端始終是當(dāng)前指行代碼所在的變量對象,作用域鏈中下一個變量對象來自外部環(huán)境,再下一個變量對象來自下一個外部環(huán)境,這樣一直延續(xù)到全局環(huán)境,全局執(zhí)行環(huán)境的變量對象始終是作用域鏈的最后一個對象。
標(biāo)識符解析是沿著作用域鏈一級一級地搜索標(biāo)識符的過程。搜索過程始終從作用域鏈的前端開始,然后逐級地向后回溯,直到找到標(biāo)識符為止。
內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境,但外部環(huán)境不能訪問內(nèi)部環(huán)境中的任何變量和函數(shù)。
無塊級作用域
JavaScript中沒有塊級作用域,例如:
if(true){ var color = "blue"; } alert(color); //"blue"
在函數(shù)中未使用var聲明的變量會被成全局變量,例如:
function add(num1,num2){ sum = num1 + num2; return sum; } var result = add(10,20); alert(sum); //30
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用js實現(xiàn)按鈕控制文本框加1減1應(yīng)用于小時+分鐘
正如標(biāo)題所言使用js實現(xiàn)按鈕控制文本框加1減1,此類主要應(yīng)用于小時+分鐘,下面有個不錯的示例,喜歡的朋友可以參考下2013-12-12簡述JavaScript提交表單的方式 (Using JavaScript Submit Form)
這篇文章主要介紹了簡述JavaScript提交表單的方式 (Using JavaScript Submit Form)的相關(guān)資料,需要的朋友可以參考下2016-03-03JavaScript數(shù)據(jù)結(jié)構(gòu)之二叉樹的遍歷算法示例
這篇文章主要介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)之二叉樹的遍歷算法,簡單介紹了javascript實現(xiàn)數(shù)據(jù)結(jié)構(gòu)中二叉樹的中序遍歷、先序遍歷及后序遍歷方法與相關(guān)使用技巧,需要的朋友可以參考下2017-04-04