前端入門7-JavaScript語法之相關術語

聲明

本系列文章內容所有梳理自如下幾個來源:javascript

做爲一個前端小白,入門跟着這幾個來源學習,感謝做者的分享,在其基礎上,經過本身的理解,梳理出的知識點,或許有遺漏,或許有些理解是錯誤的,若有發現,歡迎指點下。html

PS:梳理的內容以《JavaScript權威指南》這本書中的內容爲主,所以接下去跟 JavaScript 語法相關的系列文章基本只介紹 ES5 標準規範的內容、ES6 等這系列梳理完再單獨來說講。前端

正文-相關術語

對於從 Java 或 C++ 轉過來的開發人員來講 JavaScript 會有點讓人困惑,由於它所有都是動態的,都是運行時,並且不存在類機制。全部的都是實例對象。因此,學習一些 JavaScript 的語言特性時,最好不要試圖從 Java 中尋找相關概念硬套過來,類比能夠。java

接下去一系列關於 JavaScript 語法的文章中,將會出現不少在 Java 裏出現或者沒出現過的專業術語,因此第一篇就先來羅列一下,每一個術語先給必定的解釋。git

有的理解不了不要緊,等這系列文章看完,再回過頭來看這一張基本也都能理解了。先羅列出來,至少有個印象,不至於到時看到一臉懵逼。github

直接量

能夠直接使用的數據值,即在程序中直接出現的數據值,如:web

"hello world"

123

{name:dasu}

[]

...

等等這些直接出現可直接使用的數據值稱爲直接量,不一樣數據類型有不一樣的叫法,常見的有:數字直接量、字符串直接量、正則表達式直接量、對象直接量、數組直接量等。正則表達式

字面量

跟直接量沒什麼區別,都是同一個單詞 literals 的不一樣翻譯而已,因此直接量也就是字面量,字面量就是直接量,不一樣書可能用的不一樣翻譯而已。數組

原始值

原始類型的值稱爲原始值,原始值是不可變的。在 JavaScript 中,有兩種數據類型:原始類型和對象類型。瀏覽器

原始類型包括:數字(Number)、字符串(String)、布爾(Boolean)、null、undefined。

表達式&語句

表達式能夠理解成方程式,用於計算某個結果值或某種行爲的代碼可稱爲表達式,一般它們並不會改變程序狀態,也不會影響程序後續執行流程,如算術表達式: x+1。

語句表示一個完整的行爲,能夠是多個表達式與關鍵字、運算符等的組合。

函數&方法

function 關鍵字聲明的稱爲函數,但將函數置於對象內時,此時稱它爲對象的方法。

簡單的理解,從不一樣的角度看待,若是是從函數自己,那麼它就是個函數,若是是從對象角度看待,那麼稱某個函數是對象的方法,本質上沒什麼區別。但當調用時會有所區別。

另外,函數本質上也是一個對象。

構造函數

JavaScript 沒有相似於 Java 的 class 機制,一個函數,當和 new 關鍵字一塊兒使用時,此時稱這個函數爲構造函數。

也就是全部的函數均可以做爲構造函數,當它和 new 關鍵字一塊兒使用時,此時它的行爲有區別於普通的函數調用。

全局對象

在前端裏,當 js 的宿主是瀏覽器時,全局對象是 window。全局對象有幾點特性:

  1. js 文件中不在函數內聲明的全部變量和函數都是做爲全局對象的屬性存在。
  2. 全局對象的屬性使用時,能夠直接經過屬性名訪問,沒必要添加前綴,也就是沒必要像 window.name 這麼使用。
  3. js 文件中,函數外出現的 this 都指向全局對象 window。

全局屬性

全局對象的屬性就稱全局屬性,但這裏的全局屬性,更多的是在表示這種場景下爲全局對象建立的屬性:

<script type="text/javascript">

     weixin = dasuAndroidTv;

</script>

當咱們在函數外部直接對一個不存在的變量賦值操做時,此時等價於執行 this.weixin = dasuAndroidTv,而 this 指向全局對象,因此會自動爲全局對象添加一個屬性,屬性名爲 weixin。

因此,有時候,全局屬性是特指這種場景下爲全局對象建立的屬性。之因此會用全局屬性來稱呼這種場景,是爲了跟下面的全局變量和全局函數區分開。

全局變量

<script type="text/javascript">

     var weixin = dasuAndroidTv;

</script>

像這種不在函數內聲明的變量,稱爲全局變量。雖然,它們最終也都是做爲全局對象 window 的屬性而存在,但因爲這種方式爲 window 建立的屬性和上述介紹的不加 var 關鍵字爲全局對象添加屬性的方式有本質上的區別。

因此,爲了和上述介紹的全局屬性概念區別開來,一般稱這種經過 var 爲全局對象建立的屬性爲全局變量。

既然全局對象的屬性在任何地方均可以不加前綴的直接訪問使用,因此全局變量在任何地方均可以被使用。

對於上述介紹的那種直接對不存在的屬性進行賦值操做行爲而建立的全局屬性,是可經過 delete 動態刪除的;

而經過 var 或 function 這種聲明全局變量的方式爲全局對象建立的屬性,是不可經過 delete 刪除的。

全局函數

<script type="text/javascript">

     function add() {}

</script>

像這種不在函數內聲明的函數,稱爲全局函數。它跟全局變量的特性、用意如出一轍,區別只在於一個是變量、一個是函數而言。

包裝對象

原始類型所對應的對象類型,相似於 Java 中的包裝類。

由於原始類型不是對象,不可操做方法和屬性,但可將其轉換爲對應的對象類型,此時稱爲包裝對象,便可像操做對象同樣操做這些轉成包裝對象的原始類型數據。

包裝對象有:Number, Boolean, String

原型

因爲在 JavaScript 中,除了原始類型,其他的皆爲對象,因此它的繼承雙方只能都是對象,也就是說,對象也是繼承自對象的,那麼做爲父類角色,做爲被繼承的那個對象,此時稱它爲原型。

因此,才說 JavaScript 是基於原型的繼承語言。

原型就是相似於 Java 中父類的概念。

原型鏈

既然涉及繼承,那麼天然就有繼承結構,這個結構在 JavaScript 中就稱爲原型鏈。

好比對象 a 繼承自對象 b,對象 b 繼承自對象 c,那麼 a 的原型鏈就表示爲:a -> b -> c(省略掉內置的繼承關係)。

原型鏈用於當操做對象某個屬性時,尋找該屬性的來源。

做用域

做用域指的是變量和函數的做用域,下面統稱變量,在 JavaScript 中,變量分兩種:全局變量和局部變量。

全局變量指的是在函數外定義的變量,做用域是全局,在任何地方均可以使用,即便跨 js 文件中也可使用,由於它們其實是做爲全局對象的屬性存在,在前端裏就是做爲 window 的屬性,而多個 <script> 中的不一樣 js 文件,都是共用同一個全局對象 window,天然就能夠跨文件使用它的屬性。

局部變量指函數內部定義的變量,或者函數形參,做用域爲函數內。須要區別於 Java 中的局部變量,Java 裏的局部變量的做用域爲塊級做用域:只能在局部變量聲明的代碼塊且聲明位置以後使用;但在 JavaScript 中,變量都有聲明提早的特性,局部變量在函數內無論哪裏均可以訪問,即便聲明的位置在末尾,或內嵌的代碼塊中。

做用域鏈

在 JavaScript 中,容許在函數內部繼續定義函數,因此函數能夠存在很深的嵌套層次,這裏的嵌套層次不是指調用的嵌套,而是指函數聲明的嵌套,A 函數在 B 函數中定義,做爲 B 函數的局部變量存在這種。

而內部函數是能夠訪問外部函數內的變量的,也能夠訪問全局的變量,那麼當內部函數使用了某個外部變量,就會藉助做用域鏈,沿着做用域鏈中尋找這個外部變量到底是外部函數內的變量,仍是全局變量。

從原理上解釋,每一個函數調用時,都會建立一個函數執行上下文,執行上下文中存儲着當前上下文中的全部變量,做用域鏈,就是將具備嵌套層次的函數的上下文中的變量串接起來的存在。

仍是要反覆強調,上面的嵌套層次指的不是函數調用時的嵌套層次,而是函數定義時的嵌套層次。能夠將這裏有嵌套層次關係的函數理解成 Java 中的內部類。

閉包

MDN 中的文章對其的解釋爲:閉包是函數和聲明該函數的詞法環境的組合,這個環境包含了這個閉包建立時所能訪問的全部局部變量。

某篇文章中看到過這麼一種解釋:閉包是代碼塊和建立該代碼塊的上下文中數據的結合。

閉包的概念不怎麼好理解,有的文章裏會說,函數就是閉包,有的說內嵌的函數是閉包,這裏先不作評價,先嚐試着從上面兩種解釋中去理解一下,看可否理解,後續會專門寫一篇來說講。


你們好,我是 dasu,歡迎關注個人公衆號(dasuAndroidTv),公衆號中有個人聯繫方式,歡迎有事沒事來嘮嗑一下,若是你以爲本篇內容有幫助到你,能夠轉載但記得要關注,要標明原文哦,謝謝支持~ dasuAndroidTv2.png

原文出處:https://www.cnblogs.com/dasusu/p/10048550.html

相關文章
相關標籤/搜索