JavaScript 通俗理解

JavaScript是什麼

JavaScript是一種廣泛應用的通用編程語言,在服務器端,瀏覽器端,桌面端都有應用。
服務器端:nodejs
瀏覽器端:操作網頁
桌面端:nodejs-webkit等

本文寫作目的

記錄學習JavaScript過程中的所思所想,幫助人們快速入門這門語言。

作者背景

編程愛好者,熟練掌握C/C++,Java編程,Python編程,SQL操作

JavaScript特點

  1. 腳本語言,JavaScript直接解釋運行,他沒有編譯環節;
  2. 動態類型,JavaScript中沒有C++和Java傳統的類型概念,他的內部所有的變量類型都是可變的;
  3. 函數作用域,JavaScript中的變量基於函數作用域,沒有塊作用域概念;
  4. 基於原型,JavaScript沒有傳統的繼承概念,他的所有類型都擁有一個原型對象,所有類型通用的屬性和方法都是定義在原型上的;

腳本語言

JavaScript是一種腳本語言,不存在編譯過程,直接解釋執行。類似的語言還有Perl、Lua、Python和TCL等。
腳本語言的特點就是不用編譯,直接解釋執行,優點就是修改程序迅速,無需編譯,迅速執行。如傳統C++程序,如果某個文件進行了修改,那麼所有引用此類型的文件都需要重新編譯,如果項目足夠大,那麼這個時間可能回很長,而且編譯型語言都需要編譯環境,和運行環境不同,這個環境可能很複雜,很龐大,一般在運行的機器上是沒有這種環境的。那麼如果運行環境中出現問題,程序的定位排故就很麻煩,需要到開發機器上面模擬錯誤條件,修改程序,上傳運行環境等操作。而解釋性語言開發環境和運行環境是一致的,標誌着可以直接在運行環境上進行修改。
當然解釋性語言的缺點也很多,最主要的就是運行速度慢。JavaScript速度再快也沒有C++程序快,沒有Java程序快。

動態類型

JavaScript是一種動態類型,所謂動態類型意味着程序中變量的類型隨時可能發生變化,因此程序遵循這一種鴨子類型的概念,那就是不慣這個類型的實際類型是什麼,只要他能呱呱叫,那麼我就認爲他是鴨子。
一般來說,我們在程序中使用的所有變量都只是一個指示器,他指引我們如何去搜索內存中的對象實例,實際所有的操作都是通過變量取尋找對象實例,然後再對象實例上面操作。
對於Java和C++來說,變量在聲明的瞬間他的類型信息就已經確定了,也就是標明今後能夠引用實例的種類,超過此範圍就會報錯;
而Python是基於調用的,在Python程序的每次調用中,此參數的作用範圍內,類型信息也就固化了。也就是當程序運行到指定程序段中,一個參數的類型根據綁定的對象實例進行初始化,如果下次傳進來的是其他類型,那麼這兩次的調用,該參數類型是不同的。
對於JavaScript來說,我不管你是什麼類型,我都能綁定,我也不管你是什麼作用範圍,只要給我賦值我都敢引用。
對於Java等語言中,一個對象的構建是根據類定義的模板進行初始化的過程,實例構建完成之後這個類型的屬性和方法也就固定了,不可更改。但是在Python和JavaScript中,不僅參數類型是動態的,實例的類型也是動態的。調用者可以根據需要自行添加和刪除實例中的任何屬性和方法而不會因此任何報錯,他只會在未來訪問這個屬性的時候崩潰給你看。

函數作用域

JavaScript中凡是使用“var”聲明的變量,他在整個函數作用範圍都是可用的,也就是類似static變量在C語言中的作用,只不過C語言中作用範圍是整個文件,而JS是整個函數作用域。在新版本的JS中還可以使用let和const,let類似於傳統的變量定義,const就更好理解了。
JavaScript中函數中可以如同Java語言一樣定義var變量,可以執行代碼片段,除此之外還可以用function在函數內部定義函數,定義的函數也僅僅是定義,如果沒有顯示調用這些函數是不執行的。而這些定義在函數內部中有意義,也僅僅在函數中有意義,在函數外面你是訪問不到的,如果需要在外部訪問你可能需要構建一個對象.

基於原型

因爲JavaScript是一種基於原型,基於函數的語言。函數在他的內部是一等公民。所有的一切都是通過函數來實現的,那麼爲了模擬模板功能,他引入了prototype概念。
在JavaScript中函數和變量的處理很類似,函數中變量只是一個索引,他指向真正的實例,所有操作都是在實例上進行的。而函數也相當於一個索引,它直接指向一個prototype實體,這個實體用於保存狀態,可以在函數中利用this來訪問函數綁定的實體,爲實體添加屬性。如果使用var和function聲明,那麼這些參數和方法僅僅屬於代碼段和堆棧,等除了函數之後這些就會銷燬。如果在this上註冊函數和參數,那麼在函數構建的實例上就可以訪問。
任何一個函數都可以通過new來構建一個實例,這個實例構建出來後JavaScript會爲他保存prototype實體,我們就可以訪問在該函數中爲他的prototype註冊的屬性和方法了。如果沒有采用new構建一個實例,那麼這僅僅是一個普通的執行過程,在這個過程中JavaScript可能創建了prototype實體,然後執行完成之後,又銷燬了這個實體。
所以JavaScript的繼承其實就是不停的在Prototype上註冊屬性和方法的過程罷了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章