一袒啼、數(shù)組的常見操作
pop() 刪除最后一個
shift() 刪除第一個
push() 追加 添加到最后面
unshift() 添加到 第一個位置
二座慰、閉包技術(shù)詳解
1.1 什么是閉包
閉包實際上是一種函數(shù),所以閉包技術(shù)也是函數(shù)技術(shù)的一種;閉包能做的事情函數(shù)幾乎都能做挖垛。
閉包技術(shù)花式比較多次伶,用法也比較靈活,一般開發(fā)人員在學習閉包的時候都會遇到瓶頸帆卓,主要是因為閉包技術(shù)的分界線并不明顯巨朦。幾乎無法用一個特點去區(qū)分。
-
當一個內(nèi)部函數(shù)被其外部函數(shù)之外的變量引用時剑令,就形成了一個閉包糊啡。
function A(){ function B(){ console.log("Hello XMG!"); } return B; } var b = A(); b();//Hello XMG!
閉包的最大用處有兩個:一個是可以讀取函數(shù)內(nèi)部的變量,另一個就是讓這些變量的值始終保持在內(nèi)存中吁津。
**1.2 **封閉作用域
-
JavaScript的GC機制
- 在javascript中棚蓄,如果一個對象不再被引用,那么這個對象就會被GC回收碍脏,否則這個對象一直會保存在內(nèi)存中梭依。
-
封閉作用域
封閉作用域又稱值為封閉空間,還有一個昵稱叫小閉包典尾,以及匿名函數(shù)自調(diào)役拴。
-
基本結(jié)構(gòu):
(function(){})(); ;(function(){})(); +(function(){})(); -(function(){})(); ?(function(){})();
**技術(shù)最大目的: 全局變量私有化 **
-
技術(shù)優(yōu)點:
不污染全局空間钾埂!
內(nèi)部所有的臨時變量執(zhí)行完畢都會釋放不占內(nèi)存河闰。
可以保存全局數(shù)據(jù)。
更新復雜變量褥紫。
1.3 作用域鏈
- 嵌套之間的函數(shù)會形成作用域鏈淤击,每次對變量的訪問實際上都是對整條作用域鏈的遍歷查找。先查找最近的作用域故源,最后再查找全局作用域污抬。如果在某個作用域找到了對量就會結(jié)束本次查找過程。
- **對于作用域全局作用域查找快,還是局部作用域查找快印机? **
- 局部作用域查找要遠遠大于全局作用域查找的速度矢腻。所以高級的程序設(shè)計一般是盡量避免全局查找。
- 每次訪問都是對作用域鏈的一次遍歷查找其中全局作用域是最耗費時間的射赛。
-
解決方案:
- 當前目標使用完以后多柑,在退出作用域之前儲存這個目標,就可以在下次取到上一次的目標楣责。
-
補充:
變量的生命周期
任何一個變量在內(nèi)存中都是一個引用竣灌,這個變量是有自己的生命周期。周期結(jié)束意味著被銷毀秆麸。 一個變量在它當前的作用域內(nèi)被聲明那一刻相當于變量出生初嘹,整個當前作用域執(zhí)行完畢并退出作用域相當于變量的壽命終止。
1.4 保存作用域
保存作用域是一種更高級的閉包技術(shù)沮趣,如果函數(shù)嵌套函數(shù)屯烦,那么內(nèi)部的那個函數(shù)將形成作用域閉包。簡單的說房铭,這種閉包能夠達到的好處就是讓指令能夠綁定一些全局數(shù)據(jù)去運行驻龟;
基本結(jié)構(gòu):
var A=function(){
return function(){};
}
-
優(yōu)點:
全局數(shù)據(jù)隱藏化
可以讓某個指令運行時候綁定一些隱藏的全局數(shù)據(jù)在身上。
- 一句話: 將數(shù)據(jù)綁定在指令上運行缸匪,讓指令不再依賴全局數(shù)據(jù)翁狐。
三、面向?qū)ο?/h3>
對象是什么凌蔬?
對象就是帶有屬性和方法的數(shù)據(jù)類型谴蔑!
對象是什么凌蔬?
對象就是帶有屬性和方法的數(shù)據(jù)類型谴蔑!
任何一門高級語言都要面向?qū)ο螅琂avaScript則是基于原型的面向?qū)ο笳Z言龟梦,因此,我們的思維要由面向過程轉(zhuǎn)向面向?qū)ο?/strong>:
面向?qū)ο螅?/strong>
面向?qū)ο罄锩妫侯惡蛯ο?/p>
類是對象的抽象窃躲,而對象是類的具體實例
一切事物皆對象 JavaScript 一切皆對象
類 和 對象
對象 女朋友
小白 你有對象了嗎计贰? 泛指 女朋友
昨天陪你打LOL的那個女生是你對象嗎? 特指 某一個女朋友
在座的有喜歡吃香蕉的嗎蒂窒?
你手中那根香蕉熟了嗎躁倒? 特指對象(具體的實例)
面向?qū)ο蟮奶匦裕?/strong>
抽象
- 抽象就是忽略一個主題中與當前目標無關(guān)的那些方面,以便更充分地注意與當前目標有關(guān)的方面洒琢。
封裝
- 封裝是把過程和數(shù)據(jù)封閉起來秧秉,對數(shù)據(jù)的訪問只能通過開放的接口。
-
繼承
- 子類對象繼承使用父類的屬性和方法衰抑。
多態(tài)
- 多態(tài)是指兩個或多個屬于不同類的對象象迎,對于同一個消息(方法調(diào)用)作出不同響應的方式。
2.1 構(gòu)造函數(shù)
所有的構(gòu)造函數(shù)有一個特點:首字母大寫;
在js中我們可以理解為只要執(zhí)行以后能夠返回新的對象的函數(shù)就是構(gòu)造函數(shù)砾淌。
構(gòu)造函數(shù)技巧的最大目的:創(chuàng)造完全獨立的對象啦撮,互相之間不影響。
2.2 關(guān)鍵詞new
將一個函數(shù)變成對象并返回
在這個函數(shù)的內(nèi)部將this指向函數(shù)本身汪厨。
new這個關(guān)鍵詞實際上能夠?qū)⑷魏魏瘮?shù)直接變成一個對象赃春。它只有在和構(gòu)造函數(shù)配合的時候才有用,它相當于可以化簡構(gòu)造函數(shù)自己創(chuàng)造對象和返回對象的步驟劫乱。
2.3 構(gòu)造器(constructor) 和 原型屬性 (prototype)
在任何一個對象中都有構(gòu)造器和原型屬性织中,包括原生的對象,比如: Date, Array等衷戈;
constructor 返回對創(chuàng)建此對象的 構(gòu)造函數(shù)的引用
-
prototype 讓我們有能力向?qū)ο筇砑訉傩院头椒?/strong>
prototype它的作用就是構(gòu)造函數(shù)的一個共享庫狭吼;在這個共享庫里面存儲的所有數(shù)據(jù)將來都會被所有的新對象公用。 這樣大大降低了創(chuàng)建方法的成本脱惰。
-
原型共享庫是誰使用的搏嗡?
- 構(gòu)造函數(shù)使用原型庫,所有將來的對象共享這個原型庫拉一。
- 如果把方法都寫在構(gòu)造函數(shù)的原型庫里面采盒,將來還可以通過原型繼續(xù)拓展。 蔚润、
原型的工作原理
- 在網(wǎng)頁發(fā)布以后磅氨,原型的工作會自動做以下兩件事情:
第一:自動將原型庫中的所有內(nèi)容都放在將來的對象身上;
第二:如果共享庫中的內(nèi)容發(fā)生變化會自動更新所有對象上的數(shù)據(jù)嫡纠。
-
注意:
在面向?qū)ο蟮膶懛ó斨蟹匙猓偷墓蚕韼炖锩嫠械姆椒ㄖ械膖his默認情況都會指向?qū)淼膶ο蟆?/p>
只有在兩個情況會發(fā)生變化,那么這兩個情況一定要檢查作用域:
第一:如果在事件的作用域中除盏,this的指向會變成事件源叉橱。
第二:如果在定時器的作用域中,this的指向會變成window者蠕。
![28731-106.jpg](http://upload-images.jianshu.io/upload_images/9199255-77b4be5ae7224219.jpg?imageMogr2/auto-
orient/strip%7CimageView2/2/w/1240)
![50216-106.jpg](http://upload-images.jianshu.io/upload_images/9199255-c2b2b3b0114855ca.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)