成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS 作用域 閉包 this 原型 知識點總結(jié)

warnerwu / 1555人閱讀

摘要:如果你能看懂以下兩張圖那就可以跳過本總結(jié)了當然點個贊再走啊喂啊喂分割線你不知道的上冊作用域和閉包和查詢可以理解為查找變量賦值的目標和源頭當然賦值可以是隱晦的查詢失敗將在嚴格模式下導致拋出非嚴格模式下則會自動創(chuàng)建新變量額分別是修改原有作用域和

如果你能看懂以下兩張圖, 那就可以跳過本總結(jié)了, 當然, 點個贊再走啊喂! (#`O′)!


啊喂分割線 (#`O′)! (#`O′)! (#`O′)! (#`O′)! (#`O′)! (#`O′)! (#`O′)! (#`O′)! (#`O′)! 
你不知道的JavaScript(上冊) 作用域和閉包

LHS和RHS查詢, 可以理解為查找變量賦值的目標和源頭, 當然, "賦值"可以是隱晦的

LHS查詢失敗, 將在嚴格模式下導致拋出RefrenceError, 非嚴格模式下則會自動創(chuàng)建新變量

eval額with分別是修改原有作用域和根據(jù)參數(shù)創(chuàng)建一個新的作用域

我們?nèi)绻押瘮?shù)理解成代碼片段之間的接口?

for循環(huán)中的var會污染上級作用域 -> var會污染上級作用域 -> js(es5)沒有塊級作用域? -> 通過IIFE可以偽裝一個塊級作用域(但這種方法并不普適), 其實with和catch可以創(chuàng)建一個塊級作用域 -> js(es5)有塊級作用域, 更別說es6了

某個函數(shù)擁有上級(或上多級)作用域的引用, 就叫做閉包, 詳細一點說明就是: 當函數(shù)記住并訪問其所在的詞法作用域, 即便它是在當前詞法作用域之外執(zhí)行, 這就產(chǎn)生了閉包. 閉包可以使得函數(shù)就訪問定義時的詞法作用域, 實際上只要使用了回調(diào)函數(shù)就使用了閉包

模塊的兩個主要特征: 為創(chuàng)建內(nèi)部作用域而封裝了包裝函數(shù); 包裝函數(shù)的返回值必須包括一個內(nèi)部函數(shù)的引用;

JS只有詞法作用域(定義在書寫代碼使得作用域, 當然排除eval和with)

詞法作用域關(guān)注函數(shù)在何處聲名, 動態(tài)作用域關(guān)注函數(shù)在何處調(diào)用

bind函數(shù)經(jīng)常用于替代匿名的箭頭函數(shù), 以創(chuàng)建具名函數(shù)

this和對象原型

想比較于顯式傳入上下文對象, this關(guān)鍵字使用了一種更佳優(yōu)雅的方式, 傳遞一個對象的引用

this不指向(或不僅僅指向)函數(shù)本身或者函數(shù)的作用域, 他是在函數(shù)創(chuàng)建(調(diào)用)時被綁定的

在非嚴格模式中, 直接調(diào)用函數(shù), 通常會自動將this綁定到全局對象, 稱之默認綁定

隱式綁定即判斷調(diào)用函數(shù)時的上下文對象, 如 obj.say(), 將say中的this隱式綁定到obj

顯式綁定即call, apply, 其中一種特殊的形式叫做硬綁定, bind

使用new將會發(fā)生如下步驟: 創(chuàng)建新對象, 設(shè)置__proto__為函數(shù)的prototype, 綁定this到新對象, 默認返回這個新對象(最后這一點常被認為是new的一個副作用)

給bing, call等函數(shù)傳入null, undefined將出乎意料的導致this綁定到全局對象, 更安全的解決辦法是使用一個空對象, 如Object.create(null)

JS中基本類型本身不是對象, 只是創(chuàng)建時字面量會自動被轉(zhuǎn)化為對象, typeof null === "object" 的結(jié)果是bug

對象鍵訪問會將其中的值轉(zhuǎn)化為字符串, 就算是數(shù)字也不例外, 然而數(shù)組反之

通過遍歷對象屬性進行freeze可以模擬"深度凍結(jié)", 但是可能在無意中凍結(jié)其它(共享)對象

hasOwnProperty只檢查自身屬性, 而in操作符會搜索至原型鏈

4 in [1,2,4] 可能不會得到你想要的結(jié)果 --- 答案是false, 因為in操作符檢查的是屬性名

類/繼承描述了代碼的一種組織結(jié)構(gòu)方式->軟件對真實世界問題領(lǐng)域的建模方法

多態(tài)指父類的通用行為可以被子類用更特殊的行為重寫

JS中利用顯示偽多態(tài)(Car子類調(diào)用Vehicle.drive.call(this)), 將極大增加維護成本, 代碼復雜度, 應盡量避免使用, 或者改為將父類方法保存到子類中

總的來說, 在JS中模擬類是得不償失的

屬性的屏蔽比想象中的要復雜, 如果底層對象沒有該屬性, 則上層對象的屬性的writable:false或是其作為setter存在, 會對賦值(=)操作有影響, 當然你可以使用defineProperty來解除這種影響. 這里有個坑, 如a.b++其實相當于a.b=a.b+1

繼承意味著"復制操作", JS中通過prototype實現(xiàn)的繼承, 將只是創(chuàng)建對象之間的關(guān)聯(lián), 而不是復制操作

JS中"構(gòu)造函數(shù)"的概念僅存在于使用new操作符時, new將普通函數(shù)劫持, 將調(diào)用變成有返回值的"構(gòu)造函數(shù)調(diào)用"

JS中.constructor屬性與"構(gòu)造"毫無關(guān)系, 把他當成一個普通的屬性理解就好

JS原型繼承(B.prototype= Object.create(A.prototype))可以類比為"類的繼承"

Object.create修改[[Prototype]]以修改對象之間的連接關(guān)系, 這和new是一樣的, 但是, new還會通過Base.call(newObj)做一些其他事

空的對象(__proto__==null)叫做"字典", 因為沒有任何委托, 所以適合用來儲存數(shù)據(jù)

總的來說, 用"委托"來描述JS對象之間的關(guān)聯(lián)關(guān)系(OLOO)更合適(而不是"復制")

類風格代碼(Function,new或是ES6的Class)強調(diào)實體和實體的關(guān)系, OLOO則只關(guān)注對象關(guān)聯(lián)關(guān)系, 這里有兩張圖太棒了, 可惜放不出來

鴨子類型(if(a.b)a.b())有時比instanceof有效

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93210.html

相關(guān)文章

  • 變量類型、原型、閉包、作用面試題及識點簡單總結(jié)

    摘要:值類型是將變量的值存在內(nèi)存中。說明幾種不同的使用場景作為構(gòu)造函數(shù)對象屬性普通函數(shù)執(zhí)行,創(chuàng)建個標簽,點擊時彈出對應序號如何理解作用域自由變量作用域鏈,即自由變量的尋找閉包的兩個場景。 變量類型和計算知識點: 值類型、引用類型 //值類型 var a=100 var b=a a=200 console.log(b) //100 //引用類型 var a={age:20} var b=a b...

    mj 評論0 收藏0
  • 面試識點總結(jié)

    摘要:最近面試幾家前端職位,想知道目前的前端面試題是偏向哪一塊,都主要問到的是語法,閉包,原型鏈,繼承那一塊。并且將面試題的知識點匯總一下。參考網(wǎng)站面試題圖片過多的時候如何優(yōu)化圖標很多的時候可以用雪碧圖圖片過大時候可以壓縮一下。 最近面試幾家前端職位,想知道目前的前端面試題是偏向哪一塊,都主要問到的是ES6語法,閉包,原型鏈,繼承那一塊。并且將面試題的知識點匯總一下。有助于下次面試。 1.H...

    王晗 評論0 收藏0
  • 面試識點總結(jié)

    摘要:最近面試幾家前端職位,想知道目前的前端面試題是偏向哪一塊,都主要問到的是語法,閉包,原型鏈,繼承那一塊。并且將面試題的知識點匯總一下。參考網(wǎng)站面試題圖片過多的時候如何優(yōu)化圖標很多的時候可以用雪碧圖圖片過大時候可以壓縮一下。 最近面試幾家前端職位,想知道目前的前端面試題是偏向哪一塊,都主要問到的是ES6語法,閉包,原型鏈,繼承那一塊。并且將面試題的知識點匯總一下。有助于下次面試。 1.H...

    CrazyCodes 評論0 收藏0
  • JS篇」你不知道的 JS 識點總結(jié)(一)

    摘要:調(diào)用棧就是為了到達當前執(zhí)行位置所調(diào)用到的所用函數(shù)。方法測試是否至少有一個元素通過由提供的函數(shù)實現(xiàn)的測試返回值是終止。然而,如果存在于原型鏈上層,賦值語句的行為就會有些不同而且可能很出人意料。 typeof null 為 object 解釋 不同的對象在底層都表示為二進制,在JavaScript中二進制前三位都為0的話會被判斷為object類型,null 的二進制表示都是0,自然前三位都...

    JouyPub 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<