国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS 作用域 閉包 this 原型 知識點總結

warnerwu / 1550人閱讀

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

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


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

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

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

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

我們如果把函數理解成代碼片段之間的接口?

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

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

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

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

詞法作用域關注函數在何處聲名, 動態(tài)作用域關注函數在何處調用

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

this和對象原型

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

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

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

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

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

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

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

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

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

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

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

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

類/繼承描述了代碼的一種組織結構方式->軟件對真實世界問題領域的建模方法

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

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

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

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

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

JS中"構造函數"的概念僅存在于使用new操作符時, new將普通函數劫持, 將調用變成有返回值的"構造函數調用"

JS中.constructor屬性與"構造"毫無關系, 把他當成一個普通的屬性理解就好

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

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

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

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

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

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

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

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93210.html

相關文章

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

    摘要:值類型是將變量的值存在內存中。說明幾種不同的使用場景作為構造函數對象屬性普通函數執(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
  • 面試識點總結

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

    王晗 評論0 收藏0
  • 面試識點總結

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

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

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

    JouyPub 評論0 收藏0

發(fā)表評論

0條評論

warnerwu

|高級講師

TA的文章

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