国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

淺析JavaScript中的變量復制、參數傳遞和作用域鏈

2024-05-06 16:27:44
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了淺析JavaScript中的變量復制、參數傳遞和作用域鏈 的相關資料,需要的朋友可以參考下
 

今天在看書的過程中,又發現了自己目前對Javascript存在的一個知識模糊點:JS的作用域鏈,所以就通過查資料看書對作用域鏈相關的內容進行了學習。今天學習筆記主要有這樣幾個關鍵字:變量、參數傳遞、執行環境、變量對象、作用域鏈。

  1.變量

  變量需要注意的有兩點:變量聲明和復制變量值。

  變量聲明肯定大家都很熟悉,在JS中我們都是通過 var 關鍵字進行變量聲明的。JS中規定,通過var聲明的變量會被添加到最近的環境中,如果聲明并且初始化一個變量沒有用到var關鍵字,這個變量會被添加到全局環境中。

  關于復制變量值,因為變量的類型不同復制的過程也不同。如果變量是一個基本類型的變量的話,復制變量值時會給新復制出的變量分配新的空間,兩個變量值互不影響;如果變量是一個引用類型的話,復制的操作其實是讓兩個變量指向了同一處內存空間,修改其中一個,另一個也會跟著改變。《Javascript 高級程序設計》中的圖例其實很形象            

  2.參數傳遞

  JavaScript中的參數傳遞全部是按照值傳遞的。基本類型做參數一般都不會有什么困惑,如果引用類型做了參數,類似下面這個例子:

function setName(obj){obj.name = "tom";}var person = new Object();setName(person);alert(person.name);//顯示tom 

  這個例子中我們在setName中修改了變量的內容,在函數外也生效了。剛開始我也以為程序執行應該會彈出 undefined 或者報錯,但是卻彈出了在函數的作用域中修改的值。分析了一下參數傳遞的整個過程,這個疑惑就解決了。在參數傳遞的過程中,有很重要的一步:變量值復制。我們在調用函數時其實進行了 obj=person 這樣一步操作,所以根據上面提到的引用類型變量值復制的特點,當我們修改obj時,同時也就修改了person的值。所以JS參數傳遞的方式是值傳遞,并且只能是值傳遞。

  3.執行環境、變量對象、作用域鏈

  我對執行環境、執行環境的理解有點類似與類和對象:

  執行環境中定義了變量、函數和函數可以訪問到的其他數據,而當這個執行環境被激活時,就會根據這個執行環境創建出一個變量對象提供給解析器使用。執行環境就好比是類,變量對象就對應是對象。

  當一個執行環境激活時,它就會被推入一個棧的棧頂中執行,當它執行完畢,會將它移出棧,執行在它之前進入棧的環境,以此類推。

  而作用域鏈相當于一個存放變量對象的棧,越早被激活的執行環境創建出的變量對象越在下面,當前激活的執行環境的變量對象位于棧頂。如果當前執行環境執行完畢,那么就需要將棧頂的變量對象(對應執行環境)從棧頂移出。

  而執行環境在執行時,解析器需要訪問變量等數據都是從作用域頂端開始查找,也就是從當前執行環境對應的變量對象開始查找,如果查找不到,則往下進入外層執行環境對應的變量對象中查找,一直持續到找到需要的對象或找到全局環境的變量對象為止。所以這種查找方式也就說明了太多定義在全局環境中的變量比較影響程序的性能。

  今天學習的東西主要是概念性質的,而且比較抽象。但是這部分對于后面所有的知識都是基礎,像是之后的閉包啊,繼承啊,原型啊都要對這部分內容有很好的理解才能學的更明白透徹,所以這部分內容應該反復學習,要相信溫故而知新,古人誠不欺我也(??∀?)??



注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 香河县| 巴青县| 和林格尔县| 醴陵市| 平武县| 安岳县| 商河县| 凤凰县| 塘沽区| 寻乌县| 连山| 天门市| 兰坪| 临沂市| 施甸县| 安平县| 东方市| 泸溪县| 文登市| 安化县| 辰溪县| 镶黄旗| 弥勒县| 封丘县| 固镇县| 凤台县| 镇巴县| 石楼县| 江西省| 于田县| 宜兴市| 南江县| 三亚市| 大城县| 临邑县| 蓝田县| 雷州市| 通化县| 普格县| 瑞丽市| 新巴尔虎右旗|