日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

主要包括下面這些:

數據類型、判斷方法、執行上下文、變量對象、活動對象原型、原型鏈作用域、作用域鏈閉包、垃圾回收機制、this指向、類和模塊、繼承、函數式編程、同步異步、JS正則表達式、事件模型、Ajax、跨域訪問、DOM、BOM。

數據類型、判斷方法

ECMAScript的基本數據類型有5種:Undefined、Null、Boolean、Number、String。

其中Boolean、Number、String屬于原始類型,Undefined、Null屬于原始值。

原始類型代表了各自類型的所有成員,原始值則代表了各自特殊類型的唯一成員。

ECMAScript的復合數據類型有1種:Object(對象類型)。

Object是一種復合值,它將很多值(原始類型/值或者其他對象)聚合在一起,通過屬性的形式進行訪問。

ECMAScript的特殊對象類型:Array、Function、Math、Date、JSON、RegExp、Error,每種類型都各自代表一種獨立的類,不同的類實例擁有不同的類特性以及對應的操作方式。

ECMAScript常見數據類型劃分方式:

1.原始類型、對象類型

2.值類型、引用類型

3.可變類型、不可變類型

4.可擁有方法類型、不可擁有方法類型精確區分數據類型的判斷方法:Object.prototype.toString.call

執行上下文

JS的執行上下文可以理解為當前代碼的執行環境,在執行JS程序時,每遇到一段JS可執行代碼,都會創建一個可執行上下文。JS當中可執行代碼分為三種:全局代碼、函數代碼、eval代碼。所以一段JS程序必定會產生多個執行上下文,而JAVAScript引擎則是以堆棧的形式來對其進行管理,也就是常說的函數調用棧。棧底是全局上下文,棧頂則是當前正在執行的上下文。例如:

執行上下文在函數調用棧中的順序為(自底向上):globalStack => threeStack => twoStack => oneStack

特性

1.單線程

2.同步執行,只有棧頂的上下文處于執行中,其他上下文需要等待

3.全局上下文只有唯一的一個,它在瀏覽器關閉時出棧

4.函數的執行上下文的個數沒有限制

5.每次某個函數被調用,就會有個新的執行上下文為其創建,即使是調用的自身函數,也是如此。變量對象、活動對象

在介紹變量對象與活動對象前,首先我們需要更深入的理解執行上下文的生命周期,執行上下文的生命周期分為兩個階段:

第一個階段是創建階段,每當JS引擎在執行一段可執行代碼時,都會先進入創建階段。該階段會分別創建變量對象,建立作用域鏈,以及確定this的指向,作用域鏈和this指向會在后文闡述。所謂變量對象就是用于存儲在執行上下文中定義的變量和函數聲明,在當前上下文中每找到一個變量聲明,就會在變量對象中建立一個同名的屬性,每找到一個函數聲明,就會建立一個以函數名命名的屬性,屬性值則為指向該函數所在內存地址的引用。這些預先建立好的屬性以及屬性值,存儲著該上下文中所有的變量數據,為后續代碼的執行奠定基礎。

第二個階段是執行階段,當變量對象,作用域鏈,this指向都建立之后,執行上下文會進入到執行階段。在該階段中變量對象會轉化為活動對象,此時活動對象中的屬性都允許被訪問,并且可以執行其他數據性的操作。

兩者區別:

執行上下文處于創建階段時,變量對象中的屬性是不允許被訪問的,但是在進入到執行階段后,變量對象轉化為活動對象,并且里面的屬性都允許被外界訪問。其實兩者都屬于同一個對象,只是處于執行上下文的不同生命周期而已。

原型、原型鏈

在JavaScript中,每一個對象都會和另一個對象產生關聯,從另一個對象上繼承屬性,這里所指的另一個對象就是我們耳熟能詳的原型。原型本身也是一個對象,其他對象可以通過它實現屬性的繼承,也可以將任何一個對象作為自身對象的原型。JS中的任何對象都有原型,除了原型鏈頂端的對象:Object.prototype

所謂原型鏈,就是由對象原型所構成的訪問鏈,我稱之為“原型繼承鏈”。一個JS對象的原型指向其父類對象,而父類對象的原型又指向父類對象的父類對象,這種通過原型層層連接起來的關系就是原型鏈。

以下是幾種獲取原型對象的方法:

作用域、作用域鏈

說到作用域,就必須結合變量的訪問權限來說明。一個變量的作用域就是在程序中定義變量的區域,它規定了執行程序如何對變量進行查找,也就是確定當前的執行代碼對變量的訪問權限。在ES5中有全局作用域、函數作用域、eval作用域,在ES6中新增了塊級作用域。

作用域鏈,則需要結合函數的嵌套來說明。當定義一個函數時,它實際上創建了一個作用域節點,該節點上存儲著當前作用域中的局部變量,并且該節點會掛載在作用域鏈的底端。在該函數中嵌套定義另一個函數時,同樣會創建另一個函數作用域的節點,該節點同樣也存儲著當前函數作用域中的局部變量,在作用域鏈中會將該節點掛載在外層函數的節點之下。所以在進行變量訪問時,會從自身節點開始查找,如果未找到變量的對應值,則會繼續查找上一個節點。而由這一系列節點所串聯起來的鏈就是我們所說的作用域鏈。

JavaScript中的函數采用靜態作用域,也稱詞法作用域。當在執行函數調用時,不管何時何地執行函數,其中的變量在函數定義時就已經決定了,函數會從自身作用域節點開始,沿著作用域鏈向上訪問變量的值。

注意:作用域鏈的頂端是全局作用域,作用域鏈在函數定義時就已經創建了。

閉包、垃圾回收機制

閉包,又一個老生常談的話題,可以用一句話對之概括:有權訪問另一個函數作用域內變量的函數都是閉包。例如:

這里返回的inner函數就是能夠訪問outer函數中變量的閉包,除inner函數之外的外部作用域都無法訪問outer函數中的變量a。

閉包特性:

1.函數返回嵌套的函數形成閉包

2.閉包內部可以訪問外部的參數和變量

3.外部參數和變量在被閉包引用時不會被垃圾回收機制回收

閉包優點:

1.可避免變量對全局的污染

2.允許函數私有成員的存在

3.允許變量長駐內存

閉包缺點:

由于變量常駐內存,增大內存使用量,使用不當很容易造成內存泄漏。

閉包應用場景:

1.采用函數引用方式的setTimeout調用

2.將函數關聯到對象的實例方法

3.封裝相關的功能集

JS垃圾回收機制原理

JavaScript中的垃圾回收,主要是一種針對程序執行環境中內存的管理機制,該機制最大限度的優化了JS程序對操作系統內存的使用。垃圾回收機制也同樣非常容易理解:就是利用垃圾收集器,周期性的回收那些程序中,不被其他引用所指向的變量的內存資源。不被其他引用所指向的變量就是程序中不會再用到的變量,也就是生命周期結束的變量,這種變量多為局部變量,而全局變量只有在關閉瀏覽器或終止當前運行環境的情況下其生命周期才會結束。所以此時垃圾收集器所要做的就是周期性的檢索程序中處于結束狀態的變量,同時回收他們所占用的內存資源。

而閉包的使用則無疑會增加程序對內存資源的占用,因為在閉包中存儲著對外部變量的引用,所以只要閉包中存儲的外部引用未停止使用,那么外部變量就永遠存在,且其所占用的內存資源無法被垃圾回收機制所釋放。因此合理的使用閉包,能優化程序的執行效率及降低程序的資源占有率。

this指向

this的指向問題無疑是JavaScript語言中必須掌握的核心概念。上文提到,在執行上下文創建的階段,就會建立this指向。而更細致的說,this的指向,是在函數被調用的時候確定的。

下面是this指向的四種場景:

1.如果一個函數中有this,但是它沒有以對象方法的形式調用,而是以函數名的形式執行,那么this指向的就是全局對象。

2.如果一個函數中有this,并且這個函數是以對象方法的形式調用,那么this指向的就是調用該方法的對象。

3.如果一個函數中有this,并且包含該函數的對象也同時被另一個對象所包含,盡管這個函數是被最外層的對象所調用,this指向的也只是它上一級的對象。

4.如果一個構造函數或類方法中有this,那么它指向由該構造函數或類創建出來的實例對象。

類和模塊

類的概念

JavaScript是一種弱類型語言,其本身并不像Java等語言那樣對數據具有很強的類型區分,所以為了能夠具有面向對象的編碼風格,以其獨有的方式實現了類的機制。在JavaScript中,類的實現是基于原型(prototype)繼承機制的,如果兩個實例都從同一個原型對象上繼承了屬性,可以說它們是屬于同一個類的實例。類讓每一個成員對象都共享某些屬性,這種屬性共享的方式在編程中占有舉足輕重的地位。

ES5中的類:在ES5中,類是由函數來定義的,定義類的函數稱之為構造函數。一般這類函數會以首字母大寫的形式出現,普通的函數和方法都是以小寫字母開頭,對象實例化時通過new關鍵字來調用構造函數。構造函數上掛載著一個prototype屬性,該屬性存放的是當前類的原型對象,原型對象是類的核心,用于為每一個實例對象提供公有屬性。原型對象中還擁有一個constructor屬性,用于指向當前類的構造函數。構造函數是類的“公共標識”,而原型對象是類的“唯一標識”。以下是一個類,用于表示點的坐標:

ES6中的類:在ES6中,類的表示就更具語義化,寫法上更類似于傳統的面向對象語言。它引入了class關鍵字作為類的標識,并將ES5中prototype的constructor屬性直接作為其內部的構造函數,并且在定義類方法時不需要添加function關鍵字,類方法之間也不需要用逗號進行分隔。類中的靜態方法和靜態屬性用static關鍵字表示,一旦類函數和類屬性用static關鍵字標記后,實例對象將不會繼承這些屬性和方法,只能通過類本身來調用。同樣用ES6中的類來表示上述的例子:

模塊化

JavaScript模塊化的歷史由來已久,也并非小編用幾行的篇幅就能一語帶過,在這僅對它的特性及應用場景進行籠統的說明,如有對其原委感興趣的讀者,可以搜索其他更詳細的相關資料。

先來說CommonJS,CommonJS模塊化規范主要應用于服務器端編程,加載模塊的方式屬于同步加載,只有在加載完成之后才能執行后續操作。一個.js文件就是一個CommonJS模塊,在服務器端的模塊文件一般都保存在本地硬盤,所以加載速度較快。每一個模塊都有自己的作用域,里面定義的變量、函數、類都是私有的,對其他文件不可見。NodeJS、webpack就是以CommonJS規范的形式來實現的。

CommonJS模塊特點:

所有代碼都運行在模塊作用域,不會污染全局作用域。

模塊可以多次加載,但是只會在第一次加載時運行一次,然后運行結果就被緩存了,以后再加載,就直接讀取緩存結果。要想讓模塊再次運行,必須清除緩存。

模塊加載的順序,按照其在代碼中出現的順序。在瀏覽器環境中,對于模塊的下載很大程度上取決于網速的快慢,因此極有可能出現長時間等待現象,從而阻塞瀏覽器的渲染。所以就必須采用異步模式(AMD、CMD)。AMD模塊規范采用異步加載方式,主要用于客戶端瀏覽器環境下,但既可用于瀏覽器端也可用于服務端,CMD則專注于瀏覽器端的模塊化開發。

AMD和CMD的區別:兩者的區別在于對模塊的加載和執行方式不同,AMD會在加載完模塊的同時去執行模塊,從而擁有延遲低、效率高的特性;CMD則是加載完所有依賴模塊后,再進入程序,遇到需要執行的模塊才會執行相應的操作。

requireJS是基于AMD規范實現的模塊加載器

seaJS是基于CMD規范實現的模塊加載器

繼承

上文說道,由于js本身并不像其他傳統的面向對象語言那樣,生來就具備類的概念。所以在實現繼承的同時,需要用到js的原型及prototype機制或Apply、call、bind方法來實現。這里直接上碼,介紹幾種常見的繼承方式:

類式繼承

原型鏈繼承

繼承

函數式編程

JavaScript并不是專門的函數式編程語言,但卻能夠應用函數式編程技術,像對象一樣去操控函數。下面就例舉一些JS函數式編程的典型應用:

使用非函數式的方式計算數組中元素的平均值和標準差

使用函數式的編程方式

同步異步

單線程是JavaScript語言的一大特點,也就是在同一時間只能做一件事。所謂同步,原意就是程序的執行順序與書寫順尋保持一致;而異步,指的是程序并非按照書寫的順序來執行,會存在“跳過”執行的現象。

談及JS異步,就不得不提兩個改變執行順序的基礎函數:setTimeout和setInterval函數。這兩個函數在執行時會被壓入事件循環隊列當中,在當前作用域下的所有程序都執行完成后,才會開始執行排列在事件循環隊列當中的函數,所以這兩個函數能夠改變程序的執行順序。來看例子:

JS正則表達式

正則表達式大家應該不會陌生,JavaScript中的正則表達式用RegExp類的實例對象來表示,可以使用RegExp()構造函數來創建,也可以用直接量表達式來創建。它的主要功能是用來描述或匹配一段符合某個語法規則的字符串,多用于在一段較長的文本中檢索或替換那些符合模式的字符串內容,也經常用于用戶的輸入校驗。例如,使用如下代碼來解析一個URL:

事件模型

JavaScript的事件模型,是所有前端研發工程師必須必須必須弄清楚的一個基礎核心概念!下面為了能讓讀者迅速回憶起這部分相關的理論知識,筆者將以關鍵詞的形式進行闡述。

DOM事件流:當用戶觸發事件時,該事件首先會從最頂層的document對象開始,自頂向下沿著DOM樹的結構逐層傳播,直到觸發事件的DOM節點對象。之后會從觸發事件的DOM節點對象開始,自底向上逐層傳播,最后返回到最頂層document對象為止。這就是整個事件流傳播的過程。

事件捕獲:從最頂層的document對象開始,自頂向下沿著DOM樹的結構逐層傳播,直到觸發事件的DOM節點對象的過程。

事件冒泡:從觸發事件的DOM節點對象開始,自底向上逐層傳播,最后到達最頂層的document對象的過程。

阻止事件流傳播:既可以阻止事件捕獲階段的傳播,也可以阻止事件冒泡階段的傳播。在支持addEventListener()方法的瀏覽器中,調用事件對象的stopPropagation()方法阻止事件傳播。在IE9之前,設置事件對象的cancelBubble屬性為true來實現阻止事件進一步傳播。

阻止事件的默認行為:在支持addEventListener()的瀏覽器中,調用事件對象的preventDefault()方法取消事件的默認操作。在IE9之前,設置事件對象的returnValue屬性為false來阻止事件的默認行為。

事件委托/事件代理:利用事件冒泡的原理,將事件加到目標節點的父級節點上,觸發執行效果。好處就是:(1)可以減少事件綁定的次數,利于提高性能。(2)新添加的元素還會有之前的事件。

Ajax、跨域訪問

Ajax是瀏覽器專門用來和服務器進行交互的異步通訊技術,其核心對象是XMLHttpRequest,通過該對象可以創建一個Ajax請求。為了防止XSS攻擊,瀏覽器對Ajax做了限制,不允許Ajax跨域請求服務器,就是只能訪問當前域名下的url。

JS的跨域訪問,就是在不同的域名下進行HTTP請求與響應。JSONP就是一種常用的跨域通信方式,他利用了腳本跨域能力來模擬Ajax請求。

JSONP原理:由于Ajax請求受到同源策略的限制,所以無法跨域訪問數據。服務端需要拼接的回調函數及返回數據

注意:這里用callback參數字段將客戶端需要執行的回調函數名傳給服務端,服務端只需在封裝好json數據后,根據該字段值動態創建同名的回調函數即可。

DOM

文檔對象模型(document object model)是用來表示和操作html和XML文檔內容的基礎API。Document類型代表了一個HTML或XML文檔,document對象則是用來保存整個web頁面的dom結構,在頁面上所有的元素最終都會映射為一個dom對象。對頁面節點的操作也是通過document對象中的方法來實現的。

document對象中常用的Dom操作方法有:getElementById();getElementsByClassName();querySelector();getAttribute();等等。

BOM

瀏覽器對象模型(browser object model)是用于和瀏覽器窗口進行交互的對象,也可用于窗口與窗口之間的通信。它的核心對象是window,在window對象當中也提供了很多其他對象屬性用于操作和管理瀏覽器的各個部分。常用的window對象屬性有:

Location對象:表示該窗口中當前顯示的文檔的URL.。

History對象:用于將窗口的歷史瀏覽記錄用文檔和文檔狀態列表的形式表示。

Navigator對象:該對象包含了瀏覽器廠商和版本信息。

Screen對象:它提供了有關窗口顯示大小和可用的顏色數量信息。

常用的對話框也屬于掛載在window對象上的方法:alert(); confirm(); prompt();

分享到:
標簽:JavaScript
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定