JS—變量、作用域、內(nèi)存


  • 數(shù)據(jù)類型包括基本數(shù)據(jù)類型與復(fù)雜的數(shù)據(jù)類型object類型,而object類型在這里也說了,可以被稱為引用類型。
    在js內(nèi),我們是通過關(guān)鍵字var來聲明變量的。任何類型的變量均用var來聲明。
  • 針對(duì)不同的數(shù)據(jù)類型,變量值的類型也會(huì)不同,同樣也可以分為基本類型值與引用類型值兩種。
  • 變量被聲明為基本類型,則其值也是基本類型值,基本類型值是實(shí)際值,js允許直接操作保存在變量中的值。
  • 變量被聲明為引用類型,則其值也是引用類型值,引用類型值是保存內(nèi)存中的對(duì)象,js不允許直接操作他,則當(dāng)操作該變量時(shí),是在操作該對(duì)象的引用。(這個(gè)機(jī)理需要明白,才能理解其復(fù)制的機(jī)制)
  • 關(guān)于聲明變量時(shí),內(nèi)存的分配
  • 基本類型值:按值訪問,操作的是他們實(shí)際保存在中的值;
    引用類型值:按引用訪問,當(dāng)查詢時(shí),我們需要先從棧中讀取內(nèi)存地址,然后再順藤摸瓜地找到保存在堆內(nèi)存中的值;
  • 變量的初始化
    • 基本類型值
      var num1=5;


      棧內(nèi)存
    • 引用類型值
      var obj1=new object();


      對(duì)象內(nèi)存圖
  • 檢測(cè)類型
    • typeof
      var s="dudu";
      alert(typeof s);// string
      typeof操作符是確定變量為基本類型的。但是對(duì)于變量的值為對(duì)象或null時(shí),那么typeof會(huì)返回“object”。
    • instanceof
      alert(person instanceof Array);//變量person是Array類型么?
      因?yàn)樗幸妙愋投际荗bject的實(shí)例,所以
      alert(person instanceof Object);//返回true
  • 執(zhí)行環(huán)境及作用域
    • 執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象,該執(zhí)行環(huán)境中,定義的所有變量和函數(shù)都保存在這個(gè)對(duì)象中。
    • 在web瀏覽器中,全局執(zhí)行環(huán)境中,所有變量都保存在window對(duì)象中。
    • 每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境,當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的環(huán)境就會(huì)被推入一個(gè)環(huán)境棧中,而在函數(shù)執(zhí)行之后,棧將其環(huán)境彈出。
    • 作用域鏈——當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行時(shí),會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈。其作用就是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。作用域鏈的最前端,始終都是當(dāng)前執(zhí)行的代碼所在環(huán)境的變量對(duì)象,而作用域鏈的最后端,則是全局執(zhí)行環(huán)境的變量對(duì)象。
    • 如果環(huán)境是函數(shù),則將其活動(dòng)對(duì)象作為變量對(duì)象,活動(dòng)對(duì)象,最開始只是包含一個(gè)變量即arguments對(duì)象。
    • 標(biāo)示符解析——即沿著作用域鏈一級(jí)一級(jí)的搜索標(biāo)識(shí)符的過程,搜索過程始終從作用鏈的最前端開始,然后逐級(jí)向后回溯,直至找到標(biāo)識(shí)符為止。為什么要解析呢?因?yàn)樵诰植凯h(huán)境中使用的非自己環(huán)境的變量對(duì)象內(nèi)的變量,則需要看看,這個(gè)變量在不在作用域鏈上的外層環(huán)境內(nèi)。
  • 規(guī)律:內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境,但是外部環(huán)境不能訪問內(nèi)部環(huán)境中的任何變量和函數(shù)。
  • ** 作用域鏈的延長(zhǎng)**
    因?yàn)橛行┱Z句可以在作用域鏈的前端臨時(shí)增加一個(gè)變量對(duì)象,該變量對(duì)象也會(huì)在代碼執(zhí)行后被移除。
    • 第一種情況:try catch語句的catch塊。會(huì)創(chuàng)建一個(gè)新的變量對(duì)象,其中包含的是被拋出的錯(cuò)誤對(duì)象的聲明。
    • 第二種情況:with語句。會(huì)將指定的對(duì)象添加到作用域鏈中,即添加到當(dāng)前執(zhí)行環(huán)境的變量對(duì)象中,也就是當(dāng)前執(zhí)行換進(jìn)的變量對(duì)象中的變量也可以訪問with語句指定的對(duì)象。
      var qs="";
      with(location){
      var url=href+qs
      }
  • js沒有塊級(jí)作用域
    這里的塊級(jí)作用域,更多的是強(qiáng)調(diào)沒有像其他類C的語言中,由花括號(hào)封閉的代碼塊都有自己的作用域。但是函數(shù)是js中唯一擁有自身作用域的結(jié)構(gòu)。
  • 沒有塊級(jí)作用域,那些if(){}for(){}則需要注意啦。大括號(hào)里新建的變量,括號(hào)結(jié)束后,可不會(huì)自動(dòng)退還內(nèi)存的。
  • 聲明變量
    • var聲明的變量會(huì)自動(dòng)添加到最近的環(huán)境中,如果某變量在函數(shù)內(nèi)沒有使用var聲明,便直接初始化,那么該變量則自動(dòng)添加到全局環(huán)境中。
    • 變量聲明提升——當(dāng)前作用域內(nèi)的聲明都會(huì)提升到最前面,包括變量和函數(shù)的聲明。
      function(){
      var a="1";
      var f=function(){};
      var b="2";
      }
      變量afb的聲明會(huì)被提升到函數(shù)作用域的最前面類似如下:
      function(){
      var a,f,b;
      a="1";
      f=function(){};
      b="2";
      }
      注意函數(shù)表達(dá)式的聲明并沒有被提升,這也是函數(shù)表達(dá)式與函數(shù)聲明的區(qū)別,看下面
      function(){
      var f1;function f2(){};
      f1();//雖然f1的聲明被提升,但是f1提升后的值為undefined。所以此句會(huì)報(bào)錯(cuò)。
      f2();
      var f1=function(){};
      }
  • 查詢標(biāo)識(shí)符
  • 當(dāng)某個(gè)環(huán)境中為了讀取或?qū)懭攵靡粋€(gè)標(biāo)示符時(shí),必須通過搜索來確定該標(biāo)示符實(shí)際代表什么。搜索過程從作用域鏈的前端開始,向上逐級(jí)查詢與給定名字匹配的標(biāo)識(shí)符,如果在局部環(huán)境中找到,則停止搜索。
  • 因此訪問局部變量要比訪問全局變量更快,是吧!
  • 標(biāo)識(shí)符同名問題
    js中的一個(gè)名字以四種方式進(jìn)入作用域,其優(yōu)先級(jí)如下:
    1、語言內(nèi)置:this、arguments
    2、形式參數(shù):
    3、函數(shù)聲明:
    4、變量聲明:
    名字聲明的優(yōu)先級(jí)如上,但是初始化確實(shí)按照該名字在聲明未提前之前的代碼順序,進(jìn)行初始化。
    function(){
    var foo;
    alert(typeof foo);//function
    function foo(){}
    foo="foo";
    alert(typeof foo);//string
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,401評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,635評(píng)論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,128評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,365評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,881評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,733評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,935評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,172評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評(píng)論 1 282
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,595評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,908評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容

  • 基本類型和引用類型 js中變量類型分為兩大類。基本類型和引用類型。基本類型指值直接保存在變量本地的類型。引用類型變...
    言大大freedom閱讀 340評(píng)論 0 0
  • 第一章: JS簡(jiǎn)介 從當(dāng)初簡(jiǎn)單的語言,變成了現(xiàn)在能夠處理復(fù)雜計(jì)算和交互,擁有閉包、匿名函數(shù), 甚至元編程等...
    LaBaby_閱讀 1,684評(píng)論 0 6
  • 本章內(nèi)容 理解基本類型和引用類型的值 理解執(zhí)行環(huán)境 理解垃圾收集 由于不存在定義某個(gè)變量必須要保存何種數(shù)據(jù)類型值的...
    悶油瓶小張閱讀 313評(píng)論 0 0
  • 我們總是以為自己還小的時(shí)候,卻在某一個(gè)瞬間發(fā)現(xiàn)殘酷的時(shí)間已自行遠(yuǎn)去,徒留我們滿臉滄桑的呼喚青春! 每次去美甲店修指...
    云隼ADA閱讀 243評(píng)論 0 1
  • 目錄 UIDevice設(shè)備相關(guān)信息設(shè)備電量近距離傳感器設(shè)備性能、界面模式NSBundle獲取應(yīng)用名稱應(yīng)用短版本號(hào)應(yīng)...
    CircusJonathan閱讀 5,626評(píng)論 1 11