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