亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

js在for循環(huán)中使用java代碼 javascript遍歷對(duì)象( 三 )


js在for循環(huán)中使用java代碼 javascript遍歷對(duì)象

文章插圖
由于連接階段會(huì)給導(dǎo)入模塊變量創(chuàng)建綁定并初始化為子模塊的對(duì)應(yīng)變量,子模塊的對(duì)應(yīng)變量在評(píng)估階段會(huì)先被賦值,所以導(dǎo)入模塊變量獲得了和函數(shù)聲明變量一樣的提升效果 。例如,代碼 1 是能正常運(yùn)行的 。因此,ES6 模塊的導(dǎo)入導(dǎo)出語(yǔ)句的位置不影響模塊代碼語(yǔ)句的執(zhí)行結(jié)果 。
console.log(a) // 正常打印 a 的值 import { a } from './child.js'代碼 1
模塊循環(huán)引用對(duì)于循環(huán)引用的場(chǎng)景,會(huì)先對(duì)子模塊進(jìn)行預(yù)處理和執(zhí)行 。連接階段除了分析模塊依賴關(guān)系,還會(huì)創(chuàng)建執(zhí)行上下文和初始化變量,所以連接階段主要包括分析模塊依賴關(guān)系和對(duì)模塊進(jìn)行預(yù)處理 。如圖 9 所示,對(duì)于圖 5 的模塊關(guān)系,處理順序?yàn)椋侯A(yù)處理 B -> 預(yù)處理 A -> 執(zhí)行 B -> 執(zhí)行 A 。
js在for循環(huán)中使用java代碼 javascript遍歷對(duì)象

文章插圖
使用不當(dāng)?shù)膯栴}由于子模塊先于父模塊被執(zhí)行,子模塊直接執(zhí)行從父模塊導(dǎo)入的變量會(huì)導(dǎo)致 JS 錯(cuò)誤 。
// 文件 parent.js import {} from './child.js'; export const parent = 'parent'; // 文件 child.js import { parent } from './parent.js'; console.log(parent); // 報(bào)錯(cuò)代碼 2
如代碼 2 所示,child.js 中的導(dǎo)入變量 parent 被綁定為 parent.js 的導(dǎo)出變量 parent,當(dāng)執(zhí)行 child.js 的最后一行代碼時(shí),parent.js 還沒有被執(zhí)行,parent.js 的導(dǎo)出變量 parent 未被初始化,所以 child.js 中的導(dǎo)入變量 parent 也就沒有被初始化,會(huì)導(dǎo)致 JS 錯(cuò)誤 。注意,本文說的變量是統(tǒng)稱,包含 var、let、const、function 等關(guān)鍵字聲明的變量 。
console.log(parent) ^ ReferenceError: Cannot access 'parent' before initialization如果是異步執(zhí)行,則沒問題,因?yàn)楫惒綀?zhí)行的時(shí)候父模塊已經(jīng)被執(zhí)行了 。例如,代碼 3 是能正常運(yùn)行的 。
// parent.js import {} from './child.js'; export const parent = 'parent'; // child.js import { parent } from './parent.js'; setTimeout(() => { console.log(parent) // 輸出 'parent' }, 0);代碼 3
糾正教程觀點(diǎn)《ECMAScript 6 入門教程》一書說的三個(gè)重大差異如下:
CommonJS 模塊輸出的是一個(gè)值的拷貝,ES6 模塊輸出的是值的引用 。CommonJS 模塊是運(yùn)行時(shí)加載,ES6 模塊是編譯時(shí)輸出接口 。CommonJS 模塊的 require() 是同步加載模塊,ES6 模塊的 import 命令是異步加載,有一個(gè)獨(dú)立的模塊依賴的解析階段 。對(duì)于第 1 點(diǎn),CommonJS 和 ES6 模塊輸出的都是變量,變量都是值的引用 。該章節(jié)的評(píng)論中也有人質(zhì)疑這個(gè)點(diǎn) 。對(duì)于第 2 點(diǎn),前半句基本正確,后半句基本錯(cuò)誤 。CommonJS 模塊在執(zhí)行階段加載子模塊文件,ES6 模塊在預(yù)處理階段加載子模塊文件,當(dāng)然 ES6 模塊在執(zhí)行階段也會(huì)加載子模塊文件,不過會(huì)使用預(yù)處理階段的緩存 。從形式上看,CommonJS 模塊整體導(dǎo)出一個(gè)包含若干個(gè)變量的對(duì)象,ES6 模塊分開導(dǎo)出單個(gè)變量,如果只看父模塊,ES6 模塊的父模塊確實(shí)在預(yù)處理階段就綁定了子模塊的導(dǎo)出變量,但是預(yù)處理階段的子模塊的導(dǎo)出變量是還沒有被賦最終值的,所以并不能算真正輸出 。對(duì)于第 3 點(diǎn),CommonJS 模塊同步加載并執(zhí)行模塊文件,ES6 模塊提前加載并執(zhí)行模塊文件 。異步通常被理解為延后一個(gè)時(shí)間節(jié)點(diǎn)執(zhí)行,所以說成異步加載是錯(cuò)誤的 。
分析問題對(duì) JS 模塊機(jī)制有了更深刻的理解后,我們回來分析我遇到的問題 。
問題一首先分析圖 1 的報(bào)錯(cuò) 。業(yè)務(wù)方 App 的工程代碼用 webpack 打包,所以實(shí)際運(yùn)行的是 CommonJS 模塊 。上面講過 CommonJS 模塊循環(huán)引用使用不當(dāng)一般不會(huì)導(dǎo)致 JS 錯(cuò)誤,為啥這里會(huì)出現(xiàn) JS 報(bào)錯(cuò)呢?這是因?yàn)?,循環(huán)引用使用不當(dāng)導(dǎo)致變量的值為 undefined,我們的代碼使用了 extends[21],而 extends 不支持 undefined 。由于使用了 Bable[22] 進(jìn)行轉(zhuǎn)碼,所以由墊片 _inherits[23] 報(bào)錯(cuò) 。另外一個(gè)典型的不支持的 undefined 的 case 是 Object.create(undefined) 。


以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!

「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助: