摘要:調(diào)用棧就是為了到達(dá)當(dāng)前執(zhí)行位置所調(diào)用到的所用函數(shù)。方法測試是否至少有一個元素通過由提供的函數(shù)實(shí)現(xiàn)的測試返回值是終止。然而,如果存在于原型鏈上層,賦值語句的行為就會有些不同而且可能很出人意料。
typeof null 為 ”object” 解釋
不同的對象在底層都表示為二進(jìn)制,在JavaScript中二進(jìn)制前三位都為0的話會被判斷為object類型,null 的二進(jìn)制表示都是0,自然前三位都是0,所以執(zhí)行 typeof null 時,會返回 ”object”。
傳統(tǒng)編程語言編譯的三個步驟分詞/詞法分析
解析/語法分析
代碼生成
變量的賦值操作編譯階段 -- 首次編譯器會在當(dāng)前作用域中聲明一個變量(變量提升),如果之前沒用聲明過。
運(yùn)行階段 -- 運(yùn)行時引擎會在作用中查找該變量,如果能夠找到就會對它賦值(LHS查詢。
作用域作用域是一套規(guī)則,用于確定在何處以及如何查找變量。
如果查找的目的是對變量賦值,那么就會使用 LHS 查詢。
如果查找的目的是獲取變量的值,那么就會使用 RHS 查詢。
無論函數(shù)在哪里被調(diào)用,也無論它如何被調(diào)用,它的詞法作用域都只由函數(shù)被聲明時所處的位置決定。
閉包當(dāng)函數(shù)可以記住并訪問所在的詞法作用域,即使函數(shù)是在當(dāng)前詞法作用域之外執(zhí)行,這時就產(chǎn)生了閉包。
thisthis 在任何情況下都不指向函數(shù)的詞法作用域。
在 JavaScript 中作用域確實(shí)和對象類似,可見的標(biāo)識符都是它的屬性。
但是作用域“對象”無法通過 JavaScript 代碼訪問,它存在 JavaScript 引擎的內(nèi)部。
this 是在運(yùn)行時進(jìn)行綁定的,并不是在編寫時綁定,它的上下文取決于函數(shù)調(diào) 用時的各種條件。
this 的綁定和函數(shù)聲明的位置沒有任何關(guān)系,只取決于函數(shù)的調(diào)用方式。
當(dāng)一個函數(shù)被調(diào)用時,會創(chuàng)建一個活動記錄(有時也稱為執(zhí)行上下文)。
這個記錄會包含函數(shù)在哪里被調(diào)用(調(diào)用棧),函數(shù)的調(diào)用方法,傳入的參數(shù)等信息。this 就是記錄其中的一個屬性,會在函數(shù)執(zhí)行的過程中用到。
this 實(shí)際上是在函數(shù)被調(diào)用時發(fā)生的綁定,它指向什么完全取決于函數(shù)在哪里被調(diào)用。
調(diào)用棧 — 就是為了到達(dá)當(dāng)前執(zhí)行位置所調(diào)用到的所用函數(shù)。
bind()會返回一個硬編碼的新函數(shù),它會把參數(shù)設(shè)置為 this 的上下文并調(diào)用原始函數(shù)。
new 操作符使用 new 來調(diào)用函數(shù)時,會自動執(zhí)行下面的操作:
創(chuàng)建一個新的空對象;
這個對象會被執(zhí)行[[原型]]連接;
這個新對象會綁定到函數(shù)調(diào)用的 this;
如果函數(shù)沒用返回其他對象,那么 new 表達(dá)式中的函數(shù)調(diào)用會自動返回這個新對象。
判斷 this可以根據(jù)下面的順序來進(jìn)行判斷:
函數(shù)是否在 new 中調(diào)用(new綁定)如果是的話,this 是綁定的是新創(chuàng)建的對象。
var bar = new foo();
函數(shù)是否是通過 call apply (顯示綁定)或者硬綁定調(diào)用,如果是的話,this綁定的是指定的對象。
var bar = foo.call(obj2);
函數(shù)是否在某個上下文對象中調(diào)用(隱式調(diào)用),如果是的話,this綁定的是那個上下文對象。
var bar = obj.foo();
若果都不是的話,使用默認(rèn)綁定,如果在嚴(yán)格模式下,就綁定到 undefined,否則綁定到全局對象上。
var bar = foo();ES6 新增可計(jì)算屬性名
var prefix = "foo"; var myObject = { [prefix + "bar"]: "hello", [prefix + "baz"]: "world" } myObject["foobar"]; // hello myObject["foobaz"]; // worldin / hasOwnProperty() -- 判斷某個對象是否存在某個屬性
in 操作符會檢查屬性是否在對象及其 [[Prototype]] 原型鏈中。
hasOwnProperty() 只會檢查屬性是否在 myObject 對象中,不會檢查 [[Prototype]] 鏈。
forEach() / every() / sone() -- 歷數(shù)組的值forEach() 會遍歷數(shù)組中的所有值并忽略回調(diào)函數(shù)的返回值(忽略返回值)。
every() 方法測試數(shù)組的所有元素是否都通過了指定函數(shù)的測試(返回值是false終止)。
some() 方法測試是否至少有一個元素通過由提供的函數(shù)實(shí)現(xiàn)的測試(返回值是true終止)。
for...in -- 遍歷數(shù)組下標(biāo)/對象可枚舉屬性不保證 key 順序。
for...of -- 遍歷可迭代對象的值在可迭代對象上(包括 Array,Map,Set,String,TypedArray,arguments
對象等)上創(chuàng)建一個迭代循環(huán),調(diào)用自定義迭代鉤子自定義的 @@iterator 對象 ,并為每個不同屬性的值執(zhí)行語句。
var randoms = {? [Symbol.iterator]: function() { return {? next: function() { return { value: Math.random() }; } }; } }; var randoms_pool = []; for (var n of randoms) { randoms_pool.push( n ); // 防止無限運(yùn)行! if (randoms_pool.length === 100) break; }類的繼承和多態(tài)
多態(tài)并不表示子類和父類有關(guān)聯(lián),子類得到的只是父類的一份副本,類的繼承其實(shí)就是復(fù)制。
屬性的設(shè)置和屏蔽var myObject = {}; myObject.foo = "bar";
如果 myObject 對象中包含名為 foo 的普通數(shù)據(jù)訪問屬性,這條賦值語句只會修改已有的屬性值。
如果 foo 不是直接存在于 myObject 中,[[Prototype]] 鏈就會被遍歷,類似 [[Get]] 操作。
如果原型鏈上找不到 foo,foo 就會被直接添加到 myObject 上。
然而,如果 foo 存在于原型鏈上層,賦值語句 myObject.foo = "bar" 的行為就會有些不同 (而且可能很出人意料)。
如果屬性名 foo 既出現(xiàn)在 myObject 中也出現(xiàn)在 myObject 的 [[Prototype]] 鏈上層,那 么就會發(fā)生屏蔽。
myObject 中包含的 foo 屬性會屏蔽原型鏈上層的所有 foo 屬性,因?yàn)?myObject.foo 總是會選擇原型鏈中最底層的
foo 屬性。
轉(zhuǎn)載請注明出處,如果想要了解更多,請搜索微信公眾號:webinfoq。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/103886.html
摘要:希望幫助更多的前端愛好者學(xué)習(xí)。前端開發(fā)者指南作者科迪林黎,由前端大師傾情贊助。翻譯最佳實(shí)踐譯者張捷滬江前端開發(fā)工程師當(dāng)你問起有關(guān)與時,老司機(jī)們首先就會告訴你其實(shí)是個沒有網(wǎng)絡(luò)請求功能的庫。 前端基礎(chǔ)面試題(JS部分) 前端基礎(chǔ)面試題(JS部分) 學(xué)習(xí) React.js 比你想象的要簡單 原文地址:Learning React.js is easier than you think 原文作...
摘要:歡迎來我的個人站點(diǎn)性能優(yōu)化其他優(yōu)化瀏覽器關(guān)鍵渲染路徑開啟性能優(yōu)化之旅高性能滾動及頁面渲染優(yōu)化理論寫法對壓縮率的影響唯快不破應(yīng)用的個優(yōu)化步驟進(jìn)階鵝廠大神用直出實(shí)現(xiàn)網(wǎng)頁瞬開緩存網(wǎng)頁性能管理詳解寫給后端程序員的緩存原理介紹年底補(bǔ)課緩存機(jī)制優(yōu)化動 歡迎來我的個人站點(diǎn) 性能優(yōu)化 其他 優(yōu)化瀏覽器關(guān)鍵渲染路徑 - 開啟性能優(yōu)化之旅 高性能滾動 scroll 及頁面渲染優(yōu)化 理論 | HTML寫法...
摘要:歡迎來我的個人站點(diǎn)性能優(yōu)化其他優(yōu)化瀏覽器關(guān)鍵渲染路徑開啟性能優(yōu)化之旅高性能滾動及頁面渲染優(yōu)化理論寫法對壓縮率的影響唯快不破應(yīng)用的個優(yōu)化步驟進(jìn)階鵝廠大神用直出實(shí)現(xiàn)網(wǎng)頁瞬開緩存網(wǎng)頁性能管理詳解寫給后端程序員的緩存原理介紹年底補(bǔ)課緩存機(jī)制優(yōu)化動 歡迎來我的個人站點(diǎn) 性能優(yōu)化 其他 優(yōu)化瀏覽器關(guān)鍵渲染路徑 - 開啟性能優(yōu)化之旅 高性能滾動 scroll 及頁面渲染優(yōu)化 理論 | HTML寫法...
閱讀 1387·2021-10-08 10:04
閱讀 2710·2021-09-22 15:23
閱讀 2733·2021-09-04 16:40
閱讀 1185·2019-08-29 17:29
閱讀 1504·2019-08-29 17:28
閱讀 3001·2019-08-29 14:02
閱讀 2230·2019-08-29 13:18
閱讀 856·2019-08-23 18:35