JavaScript深刻解讀

JavaScript是運行在瀏覽器上的腳本語言。咱們平時看到豐富多彩的網頁,這要在很大程度上歸功於JavaScript。前端

引子 學點兒歷史web

JavaScript在編程語言的陣營裏也是老資格了。它誕生於1995年,由Netscape公司的Brendan Eich,在網景導航者瀏覽器上首次設計實現而成。因爲Netscape與Sun合做,Netscape管理層但願它外觀看起來像Java,所以取名爲JavaScript。編程

要知道,Java語言自其前身Oak語言在1992年誕生後,1995年才正式改名爲Java,1996年1月,Sun公司才正式發佈Java的第一個版本(JDK1.0)。瀏覽器

可見,就誕生時間而言,JavaScript可謂徹徹底底的老資格編程語言。數據結構

實際上,Netscape最初將其腳本語言命名爲LiveScript,後來Netscape在與Sun合做以後將其更名爲JavaScript。閉包

實際上,JavaScript最初受Java啓發而開始設計,目的之一就是「看上去像Java」,所以語法上也有相似之處,甚至一些名稱和命名規範也借自Java。但JavaScript的主要設計原則源自Self和Scheme。框架

在發展初期,JavaScript的標準並未肯定,同期有Netscape的JavaScript,微軟的JScript和CEnvi的ScriptEase三足鼎立。編程語言

1997年,在ECMA(歐洲計算機制造商協會)的協調下,由Netscape、Sun、微軟、Borland組成的工做組肯定統一標準:ECMA-262。函數

後來,Ecma國際以JavaScript爲基礎制定了ECMAScript標準。學習

Ecma國際的前身爲歐洲計算機制造商協會,英文名稱是European Computer Manufacturers Association,是一家國際性會員制度的信息和電信標準組織。在1994年以前,ECMA名爲歐洲計算機制造商協會,後來因爲計算機的國際化,該組織的標準也牽涉到不少其餘國家,所以該組織決定更名代表其國際性,也就是現名稱ECMA國際(Ecma International)。

能夠說,ECMAScript是一種由Ecma國際經過ECMA-262標準化的腳本程序設計語言。這種語言在萬維網上應用普遍,它每每被稱爲JavaScript或JScript,因此ECMAScript能夠理解爲是JavaScript的一個標準。實際上,JavaScript和JScript是ECMA-262標準的實現和擴展。

如今,完整的JavaScript包含三個部分:ECMAScript,文檔對象模型DOM,瀏覽器對象模型BOM。

 

到此,歷史回顧結束。

總的來講,JavaScript由三個部分構成。

其中,ECMAScript規定了JavaScript的語法;BOM規定了JavaScript訪問瀏覽器的標準,是JavaScript操做瀏覽器的接口;瀏覽器會加載文檔,咱們在瀏覽器中看到的網頁,就是瀏覽器加載的文檔,DOM則規定了JavaScript操做網頁文檔的標準,是JavaScript操做網頁文檔的接口。

進入正題

 JavaScript(簡稱「JS」)是一種弱類型的腳本語言。

與強類型語言Java不一樣,JS中聲明變量時,不須要顯式聲明變量的類型。JS中聲明的變量會根據語法環境的須要進行相應的隱式類型轉換。

JavaScript的數據類型主要分爲兩大類,一類是基本類型,另外一類是引用類型。

JavaScript中的基本類型包括4種,即string字符串,number數字,boolean布爾值,undefined。其中,undefined爲變量聲明後未賦值的情形。

引用類型又稱爲對象類型,對象分爲普通對象(有時簡稱「對象」)和函數對象(有時簡稱「函數」)。普通對象屬於Object類型,函數對象屬於Function類型。同時,Function對象也都屬於Object類型。

 

 在上述圖示中,分別列舉了一個普通對象Object,以及一個函數對象Function。同時,Object和Function互爲實例。

JavaScript中也存在一種特殊的繼承關係,這種繼承關係表如今一個賦值表達式的兩側中,左側「繼承"了右側的數據結構,能夠動態擴展右側對象的數據結構。

另外,函數對象存在原型,普通對象則無原型屬性。

函數對象能夠經過原型prototype擴展其數據結構,也能夠直接經過實例.屬性擴展數據結構;函數對象的實例能夠經過__proto__擴展其數據結構。

因爲JavaScript能夠在運行中動態改變數據結構,因此JavaScript也能夠稱爲動態類型語言。

總的來講,在JavaScript中,對象是鍵值對的組合。

原型是JavaScript的一大特色。

此外,JavaScript還有一個重要的概念,那就是閉包。

閉包聽起來比較抽象,那麼何爲閉包呢?

對此,官方給出的解使是:一個擁有許多變量和綁定了這些變量的環境的表達式(一般是一個函數),於是這些變量也是該表達式的一部分。

一般來講,當在一個函數內部再聲明函數時,內部函數能夠訪問其所在的外部函數中聲明的全部局部變量、參數和聲明的其餘內部函數。當一個這樣的內部函數在包含它們的外部函數以外被調用時,就會造成閉包。從某種程度上來講,閉包也是JavaScript語言的一種內在的,保留對詞法環境下的資源進行訪問的機制。

 在JavaScript中,能夠說,一切皆爲對象,即使是基本類型的變量,也能夠經過隱式建立對應包裝類型的臨時對象來做爲對象使用。

在圖中,外部函數中聲明的局部變量,能夠被其內部聲明的其餘內部函數使用。這之中就是閉包在起做用。從這個角度來看,閉包也是一種特殊的機制,可使得內部函數保留其對詞法環境中資源的訪問。

 應該說,學習JavaScript,可以對原型與閉包有個清晰的認識,堪稱學習到了JavaScript的精髓。

另外,JavaScript中的做用域主要分爲全局做用域和局部做用域,由此引伸出全局變量和局部變量。

好比說,一個JavaScript腳本運行在一個瀏覽器窗口中,這個瀏覽器窗口對應一個window對象,JavaScript腳本中做用域在整個瀏覽器窗口以內的變量,就稱爲全局變量;那些僅侷限在一個代碼塊或一個函數內的做用域的變量則稱爲局部變量。

在一個函數內部,若以var聲明一個變量,那麼這個變量就是一個局部變量;若是在函數內部直接聲明一個變量,未添加var關鍵字,這個變量就是全局變量。

未在任一函數內部聲明的變量,不管是否有var關鍵字修飾,均是全局變量。

談談BOM

 JavaScript是一門靈活的腳本語言,其主要應用在於對瀏覽器,及瀏覽器加載的網頁的操做。JavaScript是經過BOM操做瀏覽器的。

BOM的全拼是Browser Object Module,譯爲瀏覽器對象模型。BOM的頂級對象是window,表示一個打開的瀏覽器窗口。

上圖中,document,location,navigation,history等既是window對象的屬性,又是對象,所以又稱爲window對象的子對象。

window對象在JavaScript中做爲全局Global對象,在調用全局對象的屬性和方法時,全局對象能夠省略。

好比,咱們平時見到的相似alert(),console()等方法能夠直接調用,這些方法就是window對象的方法。對於window對象的這些方法,咱們能夠經過window對象名來調用,也能夠省略window對象名進行直接調用。

咱們平時在JavaScript腳本中定義的全局變量,都可以做爲window對象的屬性。

另外,window對象的屬性和方法能夠動態擴展。

直接聲明全局變量做爲window對象的屬性,以及聲明window對象的屬性做爲全局變量,二者有一些區別。好比,直接聲明的全局變量不能經過delete刪除,而聲明的window對象的屬性能夠經過delete刪除。

總的來講,BOM中最重要的對象非window對象莫屬。window對象不只是BOM定義的頂級對象,仍是JavaScript中的全局對象。不過,BOM目前沒有統一的標準,各瀏覽器廠商(如Chrome,Opera,Firefox,Safari等)各自對BOM有着不一樣的實現。在web前端開發中,一般須要作瀏覽器兼容,根源就在於各瀏覽器廠商的BOM模型不統一形成的。

另外,BOM模型中的window對象有個屬性document,這個屬性仍是一個對象,它是DOM的頂級對象。

聊聊DOM

DOM的全拼是Document Object Module,譯爲文檔對象模型。咱們平時用JavaScript腳本操做網頁中的元素,就是經過DOM來操做的。能夠說,DOM是JavaScript腳本操做網頁元素的接口。

DOM的標準是統一的,其標準制定者是W3C。所以,DOM不須要作瀏覽器兼容,在瀏覽器平臺上的標準是統一的。

DOM的頂級對象是document,這是BOM中定義的window對象的一個子對象。DOM從結構上看,是一顆「樹」:

咱們平時打開瀏覽器並訪問網頁,順序是這樣的:瀏覽器經過各自的BOM經過DOM加載網頁文檔,當網頁文檔在瀏覽器中被加載完畢時,JavaScript能夠經過獲取網頁元素來操做這些元素,從而實現特定的效果。

應該說,JavaScript語言入門並不太難,難在懂得其內在運行原理。同時,因爲JavaScript普遍的用途,以及簡化的須要,也產生了很多JavaScript框架,比較著名的有jQuery,easyUI等。要深刻掌握這些JavaScript框架,就離不開洞悉JavaScript的運行原理。

到此,相信您對JavaScript已經有了一個清晰的瞭解,接下來的工做,請結合實際應用,進行足夠的有效練習,相信您必定可以玩轉JavaScript!

相關文章
相關標籤/搜索