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)存圖
  • 檢測類型
    • 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ù)矿瘦。
  • ** 作用域鏈的延長**
    因?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)系作者
  • 序言:七十年代末娇钱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绊困,更是在濱河造成了極大的恐慌文搂,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秤朗,死亡現(xiàn)場離奇詭異煤蹭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門硝皂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來常挚,“玉大人,你說我怎么就攤上這事稽物⊙僬保” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵贝或,是天一觀的道長吼过。 經(jīng)常有香客問我,道長咪奖,這世上最難降的妖魔是什么盗忱? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮羊赵,結(jié)果婚禮上趟佃,老公的妹妹穿的比我還像新娘。我一直安慰自己昧捷,他們只是感情好闲昭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著靡挥,像睡著了一般汤纸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芹血,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音楞慈,去河邊找鬼幔烛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛囊蓝,可吹牛的內(nèi)容都是我干的饿悬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼聚霜,長吁一口氣:“原來是場噩夢啊……” “哼狡恬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蝎宇,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤弟劲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后姥芥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兔乞,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庸追。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霍骄。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖淡溯,靈堂內(nèi)的尸體忽然破棺而出读整,到底是詐尸還是另有隱情,我是刑警寧澤咱娶,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布米间,位于F島的核電站,受9級(jí)特大地震影響豺总,放射性物質(zhì)發(fā)生泄漏车伞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一喻喳、第九天 我趴在偏房一處隱蔽的房頂上張望另玖。 院中可真熱鬧,春花似錦表伦、人聲如沸谦去。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳄哭。三九已至,卻和暖如春纲熏,著一層夾襖步出監(jiān)牢的瞬間妆丘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工局劲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勺拣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓鱼填,卻偏偏與公主長得像药有,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苹丸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

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