成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

es6模塊輸出的值是不是拷貝的

本文小編為大家詳細介紹“es6模塊輸出的值是不是拷貝的”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“es6模塊輸出的值是不是拷貝的”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

創(chuàng)新互聯(lián)建站10多年成都定制網(wǎng)站服務;為您提供網(wǎng)站建設,網(wǎng)站制作,網(wǎng)頁設計及高端網(wǎng)站定制服務,成都定制網(wǎng)站及推廣,對混凝土泵車等多個行業(yè)擁有多年的網(wǎng)站設計經(jīng)驗的網(wǎng)站建設公司。

不是,ES6模塊輸出的是值的引用,CommonJS模塊輸出的才是一個值的拷貝。在ES6模塊中,JS引擎對腳本靜態(tài)分析的時候,遇到模塊加載命令import,就會生成一個只讀引用;等到腳本真正執(zhí)行時,再根據(jù)這個只讀引用,到被加載的那個模塊里面去取值。ES6模塊是動態(tài)引用,ES6模塊不會緩存運行結果,而是動態(tài)地去被加載的模塊取值,并且變量總是綁定其所在的模塊。

瀏覽器加載

默認情況下,瀏覽器是同步加載 JavaScript 腳本的,即渲染引擎遇到<script>標簽就會停下來,等到執(zhí)行完腳本,再繼續(xù)向下渲染。

如果是外部腳本,還必須加入腳本下載的時間。

如果腳本體積很大,下載和執(zhí)行的時間就會很長,因此造成瀏覽器堵塞,用戶會感覺到瀏覽器“卡死”了,沒有任何響應。這顯然是很不好的體驗,所以瀏覽器允許腳本異步加載,下面就是兩種異步加載的語法。

<script src="path/to/myModule.js" defer></script>
<script src="path/to/myModule.js" async></script>

<script>標簽打開defer或async屬性,腳本就會異步加載。渲染引擎遇到這一行命令,就會開始下載外部腳本,但不會等它下載和執(zhí)行,而是直接執(zhí)行后面的命令。

  • defer要等到整個頁面在內(nèi)存中正常渲染結束(DOM 結構完全生成,以及其他腳本執(zhí)行完成),才會執(zhí)行;

  • async一旦下載完,渲染引擎就會中斷渲染,執(zhí)行這個腳本以后,再繼續(xù)渲染。

一句話,defer是“渲染完再執(zhí)行”,async是“下載完就執(zhí)行”。另外,如果有多個defer腳本,會按照它們在頁面出現(xiàn)的順序加載,而多個async腳本是不能保證加載順序的。

瀏覽器加載 ES6 模塊,也使用<script>標簽,但是要加入type="module"屬性。瀏覽器對于帶有type="module"<script>,都是異步加載,不會造成堵塞瀏覽器,即等到整個頁面渲染完,再執(zhí)行模塊腳本,等同于打開了

<script type="module" src="./foo.js"></script>

如果網(wǎng)頁有多個<script type="module">,它們會按照在頁面出現(xiàn)的順序依次執(zhí)行。

注意:<script>標簽的async屬性也可以打開,這時只要加載完成,渲染引擎就會中斷渲染立即執(zhí)行。執(zhí)行完成后,再恢復渲染。一旦使用了async屬性,<script type="module">就不會按照在頁面出現(xiàn)的順序執(zhí)行,而是只要該模塊加載完成,就執(zhí)行該模塊。

對于外部的模塊腳本(上例是foo.js),有幾點需要注意:

  • 代碼是在模塊作用域之中運行,而不是在全局作用域運行。模塊內(nèi)部的頂層變量,外部不可見。

  • 模塊腳本自動采用嚴格模式,不管有沒有聲明use strict。

  • 模塊之中,可以使用import命令加載其他模塊(.js后綴不可省略,需要提供絕對 URL 或相對 URL),也可以使用export命令輸出對外接口。

  • 模塊之中,頂層的this關鍵字返回undefined,而不是指向window。也就是說,在模塊頂層使用this關鍵字,是無意義的。

  • 同一個模塊如果加載多次,將只執(zhí)行一次。


ES6 模塊也允許內(nèi)嵌在網(wǎng)頁中,語法行為與加載外部腳本完全一致。

<script type="module">
  import utils from "./utils.js";
  // other code
</script>

ES6 模塊與 CommonJS 模塊的差異

CommonJS 是同步加載模塊,ES6是異步加載模塊

CommonJS規(guī)范加載模塊是同步的,也就是說,只有加載完成,才能執(zhí)行后面的操作。由于Node.js主要用于服務器編程,模塊文件一般都已經(jīng)存在于本地硬盤,所以加載起來比較快,不用考慮非同步加載的方式,所以CommonJS規(guī)范比較適用。

但是,如果是瀏覽器環(huán)境,要從服務器端加載模塊,這時就必須采用異步模式。

瀏覽器加載 ES6 模塊是異步加載,不會造成堵塞瀏覽器,即等到整個頁面渲染完,再執(zhí)行模塊腳本


CommonJS 模塊輸出的是一個值的拷貝,ES6 模塊輸出的是值的引用。

CommonJS 模塊輸出的是值的拷貝,也就是說,一旦輸出一個值,模塊內(nèi)部的變化就影響不到這個值

ES6 模塊的運行機制與 CommonJS 不一樣。JS 引擎對腳本靜態(tài)分析的時候,遇到模塊加載命令import,就會生成一個只讀引用。等到腳本真正執(zhí)行時,再根據(jù)這個只讀引用,到被加載的那個模塊里面去取值

換句話說,ES6 的import有點像 Unix 系統(tǒng)的“符號連接”,原始值變了,import加載的值也會跟著變。因此,ES6 模塊是動態(tài)引用,ES6 模塊不會緩存運行結果,而是動態(tài)地去被加載的模塊取值,并且變量總是綁定其所在的模塊。

由于 ES6 輸入的模塊變量,只是一個“符號連接”,所以這個變量是只讀的,對它進行重新賦值會報錯。上面代碼中,main.js從lib.js輸入變量obj,可以對obj添加屬性,但是重新賦值就會報錯。因為變量obj指向的地址是只讀的,不能重新賦值,這就好比main.js創(chuàng)造了一個名為obj的const變量。

// lib.js
export let obj = {};
// main.js
import { obj } from './lib';
obj.prop = 123; // OK
obj = {}; // TypeError

此外,export通過接口,輸出的是同一個值。不同的腳本加載這個接口,得到的都是同樣的實例。


CommonJS 模塊是運行時加載,ES6 模塊是編譯時輸出接口。

因為 CommonJS 加載的是一個對象(即module.exports屬性),該對象只有在腳本運行完才會生成。

而 ES6 模塊不是對象,它的對外接口只是一種靜態(tài)定義,在代碼靜態(tài)解析階段就會生成

讀到這里,這篇“es6模塊輸出的值是不是拷貝的”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內(nèi)容的文章,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章名稱:es6模塊輸出的值是不是拷貝的
URL鏈接:http://jinyejixie.com/article0/ghohio.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供電子商務、定制開發(fā)網(wǎng)站設計、靜態(tài)網(wǎng)站網(wǎng)站營銷、關鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設
高淳县| 墨玉县| 美姑县| 竹山县| 内丘县| 繁峙县| 调兵山市| 全南县| 清丰县| 德化县| 始兴县| 新泰市| 宿松县| 耿马| 西乡县| 盐池县| 云南省| 阜宁县| 阿拉尔市| 平远县| 清水河县| 南郑县| 潜山县| 洛南县| 蒙山县| 卢龙县| 株洲市| 色达县| 北京市| 常山县| 莱芜市| 扶绥县| 桃江县| 青神县| 新龙县| 湘西| 缙云县| 商水县| 武隆县| 古丈县| 城口县|