亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JS 中 TDZ 的理解

stackvoid / 2748人閱讀

摘要:由于當(dāng)時(shí)我本身也還不知道這一回事沒(méi)有看懂,所以就花了一些時(shí)間去搞清楚什么是及會(huì)帶來(lái)一些什么問(wèn)題,本文主要是用于介紹我對(duì)的一些理解,如有問(wèn)題,多謝指出。

原文鏈接:https://acrens.github.io/2017/01/22/2017-01-22-TDZ/
春節(jié)快到了,假期也快到了,空閑之余刷個(gè)微博,看見 @ruanyf 提出了一個(gè)問(wèn)題與 TDZ 有關(guān),但是貌似阮大當(dāng)時(shí)還沒(méi)有意識(shí)到這個(gè)問(wèn)題,多虧一些其他業(yè)內(nèi)同仁提出了與 TDZ 相關(guān);當(dāng)然,以阮大的能力這都不是事。由于當(dāng)時(shí)我本身也還不知道 TDZ 這一回事沒(méi)有看懂,所以就花了一些時(shí)間去搞清楚什么是 TDZ 及TDZ會(huì)帶來(lái)一些什么問(wèn)題,本文主要是用于介紹我對(duì) TDZ 的一些理解,如有問(wèn)題,多謝指出。

示例

案例一

代碼

let y = 1;
function foo(x = y, y) {
    console.log(x);
}
foo();  // ReferenceError: y is not defined

解讀

當(dāng)函數(shù)存在默認(rèn)參數(shù)時(shí),且調(diào)用方法不傳任何參數(shù),會(huì)存在三個(gè)作用域環(huán)境;

全局作用域、參數(shù)作用域、函數(shù)體作用域;

當(dāng)執(zhí)行 foo 函數(shù)時(shí),參數(shù)作用域在 x = y 之后才定義 let y,注意:let 定義,所以根據(jù) let 定義變量的作用知道 x = y 肯定會(huì)報(bào)錯(cuò);

代碼翻譯:將以上代碼翻譯之后可以按下面代碼片段閱讀更易于理解

function analysis() {
    "use strict";
    let y = 1;

    function foo() {  
        let x = arguments[0] !== (void 0) ? arguments[0] : y;   // y not defined
        let y = arguments[1];
    }
    foo();

    return {};
}

案例二

代碼

let y = 1;
function foo(x = function(){console.log(y)}, y = 2) {
    x(); // 2
    y = 3;
    x(); // 3
}
foo();
console.log(y); //1

解讀

當(dāng)函數(shù)存在默認(rèn)參數(shù)時(shí),且調(diào)用方法不傳任何參數(shù),會(huì)存在三個(gè)作用域環(huán)境;

全局作用域、參數(shù)作用域、函數(shù)體作用域;

當(dāng)執(zhí)行 foo 函數(shù)時(shí),x 被申明為匿名函數(shù)變量,此時(shí)函數(shù)并未被執(zhí)行,所以正常;之后定義 y 值為 2,此時(shí)調(diào)用 x() 輸出的當(dāng)然是變量 y 的值,之后繼續(xù)修改 y 的值,再繼續(xù)調(diào)用 x(),輸出 y 最新值 3;當(dāng)執(zhí)行外部 console.log(y) 時(shí)并不能訪問(wèn)內(nèi)部函數(shù)變量,訪問(wèn)的變量是當(dāng)前域下的 y = 1 的值 1,所以輸出 1;

代碼翻譯:將以上代碼翻譯之后可以按下面代碼片段閱讀更易于理解

function analysis() {
    "use strict";
    let y = 1;

    function foo() {  
        let x = arguments[0] !== (void 0) ? arguments[0] : function() {
            console.log(y);
        };
        let y = arguments[1] !== (void 0) ? arguments[1] : 2;
        x(); // 2
        y = 3;
        x();    // 3
    }
    foo();
    console.log(y); // 1

    return {};
}

案例三

代碼

let y = 1;
function foo(x = function(){console.log(y)}) {
    let y = 3;
    x(); // 1
}
foo();

解讀

當(dāng)函數(shù)存在默認(rèn)參數(shù)時(shí),且調(diào)用方法不傳任何參數(shù),會(huì)存在三個(gè)作用域環(huán)境;

全局作用域、參數(shù)作用域、函數(shù)體作用域;

當(dāng)執(zhí)行 foo 函數(shù)時(shí),x 被賦值為一個(gè)匿名函數(shù)的變量,且存在與參數(shù)作用域內(nèi),let y = 3 會(huì)被定義到函數(shù)體作用域內(nèi),屬于參數(shù)作用域的內(nèi)部函數(shù);當(dāng) x() 執(zhí)行時(shí)是在函數(shù)體作用域定被調(diào)用,但是其定義是在參數(shù)作用域,所以執(zhí)行環(huán)境是在參數(shù)作用域內(nèi),此時(shí)在參數(shù)作用域沒(méi)有定義 y 變量,也不能訪問(wèn)內(nèi)部函數(shù) funBody 內(nèi)部定義的變量 y,此時(shí)往上級(jí)函數(shù)查找是否存在 y 被定義,如果被定義則輸出其值,所以輸出最外層變量 y 的值 1;

代碼翻譯:將以上代碼翻譯之后可以按下面代碼片段閱讀更易于理解

function analysis() {
    "use strict";
    let y = 1;

    function foo() {  
        let x = arguments[0] !== (void 0) ? arguments[0] : function() {
            console.log(y);
        };

        function funBody() {
            let y = 3;
            x();
        }
        funBody();
    }
    foo();

    return {};
}

案例四

代碼

function foo(x = function(){console.log(y)}) {
    let y = 3;
    x(); // // ReferenceError: y is not defined
}
foo();

解讀

當(dāng)函數(shù)存在默認(rèn)參數(shù)時(shí),且調(diào)用方法不傳任何參數(shù),會(huì)存在三個(gè)作用域環(huán)境;

全局作用域、參數(shù)作用域、函數(shù)體作用域;

當(dāng)執(zhí)行 foo 函數(shù)時(shí),x 被賦值為一個(gè)匿名函數(shù)的變量,且存在與參數(shù)作用域內(nèi),let y = 3 會(huì)被定義到函數(shù)體作用域內(nèi),屬于參數(shù)作用域的內(nèi)部函數(shù);當(dāng) x() 執(zhí)行時(shí)是在函數(shù)體作用域定被調(diào)用,但是其定義是在參數(shù)作用域,所以執(zhí)行環(huán)境是在參數(shù)作用域內(nèi),此時(shí)在參數(shù)作用域沒(méi)有定義 y 變量,也不能訪問(wèn)內(nèi)部函數(shù) funBody 內(nèi)部定義的變量 y,此時(shí)往上級(jí)函數(shù)查找是否存在 y 被定義,如果被定義則輸出其值,否則報(bào) y 沒(méi)有被定義錯(cuò)誤,此案例只是案例三的一種測(cè)試;

代碼翻譯:將以上代碼翻譯之后可以按下面代碼片段閱讀更易于理解

function analysis() {
    "use strict";
    function foo() {  
        let x = arguments[0] !== (void 0) ? arguments[0] : function() {
            console.log(y);
        };

        function funBody() {
            let y = 3;
            x();
        }
        funBody();
    }
    foo();

    return {};
}

參考

以上核心部分在代碼翻譯部分,通過(guò)配合一下資料及個(gè)人的理解,翻譯出通俗易懂的代碼:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_and_errors_with_let;

http://dmitrysoshnikov.com/ecmascript/es6-notes-default-values-of-parameters/#tdz-temporal-dead-zone-for-parameters;

https://github.com/google/traceur-compiler/issues/1604。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/81315.html

相關(guān)文章

  • 理解ES6暫時(shí)死區(qū)(TDZ)

    摘要:以英文名詞來(lái)說(shuō)明,是時(shí)間的暫時(shí)的意義,則是死區(qū),意指電波達(dá)不到的區(qū)域。所以可以翻為時(shí)間上暫時(shí)的無(wú)法達(dá)到的區(qū)域,簡(jiǎn)稱為時(shí)間死區(qū)或暫時(shí)死區(qū)。以聲明的變量或常量,必需是經(jīng)過(guò)對(duì)聲明的賦值語(yǔ)句的求值后,才算初始化完成,創(chuàng)建時(shí)并不算初始化。 Temporal Dead Zone(TDZ)是ES6(ES2015)中對(duì)作用域新的專用語(yǔ)義。TDZ名詞并沒(méi)有明確地寫在ES6的標(biāo)準(zhǔn)文件中,一開始是出現(xiàn)在ES...

    Mike617 評(píng)論0 收藏0
  • 深入理解let和var區(qū)別(暫時(shí)性死區(qū))?。?!

    摘要:會(huì)出現(xiàn)這樣的情況是因?yàn)閾碛袝簳r(shí)性死區(qū)。規(guī)定暫時(shí)性死區(qū)和語(yǔ)句不出現(xiàn)變量提升,主要是為了減少運(yùn)行時(shí)錯(cuò)誤,防止在變量聲明前就使用這個(gè)變量,從而導(dǎo)致意料之外的行為。 首先我們應(yīng)該知道js引擎在讀取js代碼時(shí)會(huì)進(jìn)行兩個(gè)步驟: 第一個(gè)步驟是解釋。 第二個(gè)步驟是執(zhí)行。 所謂解釋就是會(huì)先通篇掃描所有的Js代碼,然后把所有聲明提升到頂端,第二步是執(zhí)行,執(zhí)行就是操作一類的。 我們先來(lái)看個(gè)簡(jiǎn)單的變量提升...

    tanglijun 評(píng)論0 收藏0
  • 深入理解ES6筆記(一)塊級(jí)作用域綁定

    摘要:和都能夠聲明塊級(jí)作用域,用法和是類似的,的特點(diǎn)是不會(huì)變量提升,而是被鎖在當(dāng)前塊中。聲明常量,一旦聲明,不可更改,而且常量必須初始化賦值。臨時(shí)死區(qū)臨時(shí)死區(qū)的意思是在當(dāng)前作用域的塊內(nèi),在聲明變量前的區(qū)域叫做臨時(shí)死區(qū)。 主要知識(shí)點(diǎn)有:var變量提升、let聲明、const聲明、let和const的比較、塊級(jí)綁定的應(yīng)用場(chǎng)景showImg(https://segmentfault.com/img...

    馬忠志 評(píng)論0 收藏0
  • 深入理解ES6之《塊級(jí)作用域綁定》

    摘要:眾所周知,中的聲明存在變量提升機(jī)制,因此引用了塊級(jí)作用域來(lái)強(qiáng)化對(duì)變量生命周期的控制聲明不會(huì)被提升,有幾個(gè)需要注意的點(diǎn)不能被重復(fù)聲明假設(shè)作用域中已經(jīng)存在某個(gè)標(biāo)識(shí)符無(wú)論該標(biāo)識(shí)符是通過(guò)聲明還是變量聲明,此時(shí)再使用或關(guān)鍵定聲明會(huì)拋錯(cuò)此處則會(huì)拋出錯(cuò)誤 眾所周知,js中的var聲明存在變量提升機(jī)制,因此ESMAScript 6引用了塊級(jí)作用域來(lái)強(qiáng)化對(duì)變量生命周期的控制let const 聲明不會(huì)被...

    Nosee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<