国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記錄--為什么 export 導(dǎo)出一個(gè)字面量會(huì)報(bào)錯(cuò),而使用 export default 就不會(huì)報(bào)錯(cuò)?

這篇具有很好參考價(jià)值的文章主要介紹了記錄--為什么 export 導(dǎo)出一個(gè)字面量會(huì)報(bào)錯(cuò),而使用 export default 就不會(huì)報(bào)錯(cuò)?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

這里給大家分享我在網(wǎng)上總結(jié)出來的一些知識(shí),希望對(duì)大家有所幫助

記錄--為什么 export 導(dǎo)出一個(gè)字面量會(huì)報(bào)錯(cuò),而使用 export default 就不會(huì)報(bào)錯(cuò)?

核心

其實(shí)總的來說就是 export 導(dǎo)出的是變量的句柄(或者說符號(hào)綁定、近似于 C 語言里面的指針,C++里面的變量別名),而 export default 導(dǎo)出的是變量的值。

需要注意的是:模塊里面的內(nèi)容只能在模塊內(nèi)部修改,模塊外部只能使用。esModule在語法層面做了一層淺層的保護(hù)(即將import導(dǎo)入的變量聲明為常量)

而變量的句柄必須通過 var、let、const、function 這些關(guān)鍵字聲明才可以由 js 引擎生成,而值(或者說數(shù)據(jù))可以通過變量運(yùn)算或者字面量直接生成。

下面是測(cè)試用例:

// a.js
export let a = 'a'

export let objA = { a: 'a' }

let defaultA = 1
export default defaultA

export function fn(str) {
    a = str
    defaultA = str
}
// test1.js
import b, { a, fn, objA } from './a.js'
console.log(a, '---', b, '---', objA.a, '---', 'test1.js')
setTimeout(() => {
    objA.a = 'hello world'
    fn('hello world')
    console.log(a, '---', b, '---', objA.a, '---', 'test1.js')
})
// test2.js
import b, { a, objA } from './a.js'
console.log(a, '---', b, '---', objA.a, '---', 'test2.js')
setTimeout(() => {
    console.log(a, '---', b, '---', objA.a, '---', 'test2.js')
}, 100)
// main.js
import './test1.js'
import './test2.js'

運(yùn)行main.js,輸出結(jié)果如下:

記錄--為什么 export 導(dǎo)出一個(gè)字面量會(huì)報(bào)錯(cuò),而使用 export default 就不會(huì)報(bào)錯(cuò)?

?

分析

  • 通過 a 值的變化可以看出,在 test1.js 中的修改會(huì)影響到 test2.jsa 的值,驗(yàn)證我們說的導(dǎo)出句柄這個(gè)觀點(diǎn)。
  • 通過 b 的運(yùn)行結(jié)果可以驗(yàn)證 export default 導(dǎo)出變量的值的觀點(diǎn)。
  • 通過 objA.a 的運(yùn)行結(jié)果可以驗(yàn)證淺層保護(hù)的觀點(diǎn),其實(shí)和const obj = {},我們可以修改 obj 的屬性,只要不對(duì) obj 重新賦值都是允許的是同一個(gè)邏輯。

如果看到這里你完全理解上面的內(nèi)容,那么下面的內(nèi)容就建議你跳過了,因?yàn)橄旅媸且恍┘?xì)節(jié)的展開和補(bǔ)充,對(duì)你來說可能會(huì)有些啰嗦和浪費(fèi)時(shí)間。如果上面的內(nèi)容你還不是很理解,那么可以再看看下面的內(nèi)容,看看是否對(duì)你有幫助。

那我們就按照以下幾個(gè)方面具體來講講這個(gè)問題,順便再做一些擴(kuò)展和補(bǔ)充。

  • 1、句柄和值
  • 2、ES module 和 commonJs
  • 3、關(guān)于 Tree Shaking 的思考

句柄和值

其實(shí)句柄這個(gè)詞我個(gè)人理解為權(quán)限,獲得句柄就是獲得某種東西的操作權(quán)限,比如拿到文件句柄就可以對(duì)文件進(jìn)行讀寫操作。其實(shí)怎么理解都可以,只不過我引用了句柄這個(gè)詞語。我想說明的是 export 導(dǎo)出的是一個(gè)變量的句柄(或者說是引用),這個(gè)概念類似于 C 語言里面的指針,C++里面的變量別名。也就是說,導(dǎo)入模塊在拿到這個(gè)變量時(shí),對(duì)這個(gè)變量的操作實(shí)際上是在操作原來的導(dǎo)出變量本身。

而值其實(shí)就是一份數(shù)據(jù),也可以理解成 export default 導(dǎo)出的是一份數(shù)據(jù)拷貝。

擴(kuò)展

一、js 中聲明變量的幾種方式

  • var、let、const
  • function
  • class
  • import(準(zhǔn)確來講并沒有創(chuàng)建新的變量,但是這個(gè)關(guān)鍵字導(dǎo)入了被導(dǎo)入模塊的變量的引用,而在 js 引擎層面并沒有聲明新的變量)

注意:

// main.js
export { default as a } from 'xxx/a.xxx'

這種情況下,a 這個(gè)變量在 main.js 這個(gè)模塊中是訪問不到的。如果想要在 main.js 這個(gè)模塊中訪問到 a 模塊,需要使用 import 語句進(jìn)行導(dǎo)入,再使用 export 暴露給外界。

// main.js
import a from 'xxx/a.xxx'
export a

二、堆棧內(nèi)存

  • 堆內(nèi)存:存放引用類型的數(shù)據(jù),例如對(duì)象、數(shù)組等
  • 棧內(nèi)存:存放基本數(shù)據(jù)類型和引用類型的地址(存放占用空間固定的數(shù)據(jù)

ES module 和 CommonJS

1、實(shí)現(xiàn)層面

ES module 和 CommonJS 比較大的一個(gè)區(qū)別就是一個(gè)是官方規(guī)范,一個(gè)是社區(qū)規(guī)范。官方規(guī)范自然就能的到 js 語法層面的實(shí)現(xiàn)支持,而社區(qū)規(guī)范只能通過在現(xiàn)有的語法基礎(chǔ)上進(jìn)行擴(kuò)展來實(shí)現(xiàn)。

2、單獨(dú)導(dǎo)出和默認(rèn)導(dǎo)出

其實(shí) CommonJS 的實(shí)現(xiàn)也特別簡(jiǎn)單,看一眼 webpack 的打包結(jié)果就知道了。核心原理就是將一個(gè)個(gè)模塊放到函數(shù)中運(yùn)行,這樣利用函數(shù)作用域的特點(diǎn),就可以實(shí)現(xiàn)模塊之間的環(huán)境隔離。所以在 CommonJS 中,module.exports 和 exports 本質(zhì)上就是同一個(gè)對(duì)象,這個(gè)對(duì)象就是這個(gè)模塊(函數(shù))運(yùn)行時(shí) return 的對(duì)象。

而 ES module 則不然,export 和 export default 有著本質(zhì)的差別,那就是一個(gè)導(dǎo)出變量的句柄,一個(gè)導(dǎo)出變量的值。

擴(kuò)展(關(guān)于 export 導(dǎo)出的細(xì)節(jié))

關(guān)于 export 導(dǎo)出,出了這種下面常用的方式:

// a.js
export let a = 1

還有一種方式:

// b.js
let b = 1
export { b }

而這兩種模塊的導(dǎo)入方式都是一樣:

import { a } from 'xx/a.js'
import { b } from 'xx/b.js'

既然前面說了,export 導(dǎo)出的是變量的句柄,那么顯然下面這種方式是要報(bào)錯(cuò)的:

// b.js
export { b: 1 } // SyntaxError: Unexpected token ':'

因?yàn)閷?dǎo)入方式一樣,那么很自然的我就想測(cè)試一下,我按照下面這種方式來測(cè)試一下看會(huì)不會(huì)產(chǎn)生沖突

let b = 1
export { b }
export let b = 2 // SyntaxError: Identifier 'b' has already been declared

很顯然使用 let、const 這樣的關(guān)鍵字會(huì)產(chǎn)生一個(gè)重復(fù)定義的沖突,那么我們?cè)僭囈幌铝硗庖粋€(gè)可以讓我們多次重復(fù)聲明同一個(gè)變量的 var 關(guān)鍵字。

var b = 1
export { b }
export var b = 2 // SyntaxError: Duplicate export of 'b'
?

改成 var 之后,不會(huì)在一開始編輯器就提示我們錯(cuò)誤了,而是在運(yùn)行時(shí),報(bào)一個(gè)重復(fù)導(dǎo)出的錯(cuò)誤。所以通過測(cè)試,這兩種 export 導(dǎo)出方式還是不會(huì)產(chǎn)生沖突的。

3、動(dòng)態(tài)導(dǎo)入

CommonJS 動(dòng)態(tài)導(dǎo)入就很簡(jiǎn)單,其實(shí)就是運(yùn)行函數(shù)。其實(shí) CommonJS 導(dǎo)入本身就是在運(yùn)行函數(shù),所以動(dòng)態(tài)或者靜態(tài)其實(shí)都一樣。

const a = require('xxx/a.js')
ES module 動(dòng)態(tài)導(dǎo)入,那就需要語法的支持,使用下面這種語法:
const a = await import('xxx/a.js')

關(guān)于 Tree Shaking 的思考

我們知道,ES module 是支持 Tree Shaking 的,但是 CommonJS 是不支持的。

其實(shí) Tree Shaking 面臨的核心困難就是怎么確定一個(gè)函數(shù)或者模塊它是否包含副作用。如果寫的都是純函數(shù),那么 Tree Shaking 其實(shí)是很實(shí)現(xiàn)的。那么像有些函數(shù),在編譯時(shí)直接可以運(yùn)行函數(shù)得到調(diào)用結(jié)果,進(jìn)而在生產(chǎn)運(yùn)行時(shí),直接省去求值的耗時(shí)。

所以 Tree Shaking 的核心是在于副作用的檢測(cè),特別是在復(fù)雜的模塊引用關(guān)系里面,確定每個(gè)模塊里的某些內(nèi)容是否存在副作用。另外為了更好的 Tree Shaking,比較推薦的方案是使用 ES module,并且使用 export 導(dǎo)出,這方式可以更好的進(jìn)行 Tree Shaking。

本文轉(zhuǎn)載于:

https://juejin.cn/post/7315681269702541323

如果對(duì)您有所幫助,歡迎您點(diǎn)個(gè)關(guān)注,我會(huì)定時(shí)更新技術(shù)文檔,大家一起討論學(xué)習(xí),一起進(jìn)步。

?記錄--為什么 export 導(dǎo)出一個(gè)字面量會(huì)報(bào)錯(cuò),而使用 export default 就不會(huì)報(bào)錯(cuò)?文章來源地址http://www.zghlxwxcb.cn/news/detail-798636.html

到了這里,關(guān)于記錄--為什么 export 導(dǎo)出一個(gè)字面量會(huì)報(bào)錯(cuò),而使用 export default 就不會(huì)報(bào)錯(cuò)?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 記錄--居中為什么要使用 transform?

    記錄--居中為什么要使用 transform?

    居中是我們?cè)谇岸瞬季种薪?jīng)常會(huì)遇到的問題,其中包括水平居中和垂直居中。居中的方法很多,比如說水平居中可以使用 text-align: center 或者 margin: 0 auto 等等來實(shí)現(xiàn),垂直居中則需要使用一些其它的特殊的技巧。比如說常見的做法是使用 transform 來實(shí)現(xiàn)垂直居中, margin-top 或

    2024年02月05日
    瀏覽(23)
  • 記錄--為什么沒有人能講清楚 BFC?

    記錄--為什么沒有人能講清楚 BFC?

    CSS 規(guī)范(英文) | 中文翻譯 浮動(dòng),絕對(duì)定位的元素,非塊盒的塊容器(例如inline-blocks,table-cells和table-captions),以及’overflow’不為’visible’的塊盒(當(dāng)該值已被傳播到視口時(shí)除外(except when that value has been propagated to the viewport))會(huì)為其內(nèi)容建立新的塊格式化上下文 在一個(gè)

    2024年02月05日
    瀏覽(22)
  • 微信為什么使用 SQLite 保存聊天記錄?

    微信為什么使用 SQLite 保存聊天記錄?

    ? SQLite 是一個(gè)被大家低估的數(shù)據(jù)庫,但有些人認(rèn)為它是一個(gè)不適合生產(chǎn)環(huán)境使用的玩具數(shù)據(jù)庫。事實(shí)上,SQLite 是一個(gè)非??煽康臄?shù)據(jù)庫,它可以處理 TB 級(jí)的數(shù)據(jù),但它沒有網(wǎng)絡(luò)層。接下來,本文將與大家共同探討 SQLite 在過去一年中最新的 SQL 功能。 ? SQLite “只是”一個(gè)庫

    2024年02月10日
    瀏覽(88)
  • 記錄--為什么推薦用svg而不用icon?

    記錄--為什么推薦用svg而不用icon?

    使用背景: 1.因?yàn)閟vg圖標(biāo)在任何設(shè)備下都可以高清顯示,不會(huì)模糊。而icon會(huì)在顯卡比較低的電腦上有顯示模糊的情況 2.svg圖標(biāo)在頁面render時(shí) 速度會(huì)比icon稍微快一點(diǎn) 3.實(shí)現(xiàn)小程序換膚功能 ;方案見:www.yuque.com/lufeilizhix… SVG基礎(chǔ)可參考:www.yuque.com/lufeilizhix… inline svg是目前前

    2024年02月08日
    瀏覽(31)
  • 記錄--post為什么會(huì)發(fā)送兩次請(qǐng)求?

    記錄--post為什么會(huì)發(fā)送兩次請(qǐng)求?

    在前段時(shí)間的一次面試中,被問到了一個(gè)如標(biāo)題這樣的問題。要想好好地去回答這個(gè)問題,這里牽扯到的知識(shí)點(diǎn)也是比較多的。 那么接下來這篇文章我們就一點(diǎn)一點(diǎn)開始引出這個(gè)問題。 在瀏覽器中,內(nèi)容是很開放的,任何資源都可以接入其中,如 JavaScript 文件、圖片、音頻

    2024年02月12日
    瀏覽(21)
  • 記錄--強(qiáng)制緩存這么暴力,為什么不使用協(xié)商緩存

    記錄--強(qiáng)制緩存這么暴力,為什么不使用協(xié)商緩存

    前段時(shí)間在看面經(jīng)的時(shí)候,發(fā)現(xiàn)很多份面經(jīng)中都被問到了 強(qiáng)緩存 和 協(xié)商緩存 。因此我覺得有必要寫一篇文章來好好聊聊這兩者。 瀏覽器緩存是瀏覽器在本地磁盤對(duì)用戶最近請(qǐng)求過的文檔進(jìn)行存儲(chǔ),當(dāng)訪問者再次訪問同一頁面時(shí),瀏覽器就可以直接從本地磁盤加載文檔,其中瀏覽

    2024年02月10日
    瀏覽(32)
  • 記錄--為什么要使用 package-lock.json?

    記錄--為什么要使用 package-lock.json?

    隨著 JavaScript 在現(xiàn)代軟件開發(fā)中的日益重要地位, Node.js 生態(tài)系統(tǒng)中的 npm 成為了不可或缺的工具。在 npm 管理依賴的過程中, package-lock.json 文件的作用日益凸顯。本文將深入探討為什么要使用 package-lock.json ,以及它在項(xiàng)目開發(fā)中的重要性。 在討論 package-lock.json 的重要性之

    2024年02月11日
    瀏覽(16)
  • [20231023]為什么刷新緩存后輸出記錄順序發(fā)生變化6.txt

    [20231023]為什么刷新緩存后輸出記錄順序發(fā)生變化6.txt --//前幾天做了單表刷新緩存后輸出記錄順序發(fā)生變化的情況,測(cè)試2個(gè)表的情況時(shí)遇到一個(gè)奇怪的現(xiàn)象。 --//我前面的測(cè)試18c,如果使用10046跟蹤看不到我遇到的情況,我想使用strace跟蹤,發(fā)現(xiàn)該機(jī)器配置使用asm,strace跟蹤無法

    2024年02月06日
    瀏覽(37)
  • [20231013]為什么刷新緩存后輸出記錄順序發(fā)生變化3.txt

    [20231013]為什么刷新緩存后輸出記錄順序發(fā)生變化3.txt --//當(dāng)年提的問題,鏈接http://blog.itpub.net/267265/viewspace-2763181/= [20210316]為什么刷新緩存后輸出記錄順序發(fā)生變化.txt, --//正好別人問我,順便我重復(fù)看了一下,順便解答這個(gè)問題,實(shí)際上也許解答不對(duì),許多行為我僅僅是猜測(cè)

    2024年02月08日
    瀏覽(27)
  • 為什么一個(gè)矩陣乘以一個(gè)滿秩矩陣后秩不變

    A為N階方陣,r(A) =p ,其中p n. B為N階方陣,r(B)=n. 證明: r(AB) = p. 定理1:矩陣B可逆,則存在有限個(gè)初等矩陣 P 1 , P 2 , P 3 . . . P n P_1,P_2,P_3...P_n P 1 ? , P 2 ? , P 3 ? ... P n ? ,使得 A = P 1 P 2 . . . . P n A=P_1P_2....P_n A = P 1 ? P 2 ? .... P n ? 定理2:矩陣B滿秩,則矩陣B可逆 定理3:進(jìn)行

    2024年02月10日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包