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