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

資訊專欄INFORMATION COLUMN

ES6學(xué)習(xí)之 -- let和const命令

marser / 1020人閱讀

摘要:命令用來聲明變量,它的用法類似,但是命令聲明的變量只在所在的代碼塊中有效。不允許重復(fù)聲明不允許在同一作用域聲明兩個(gè)相同的變量。對(duì)于內(nèi)部的數(shù)據(jù)結(jié)構(gòu)的變化是無法控制的。

let命令
用來聲明變量,它的用法類似var,但是let命令聲明的變量只在所在的代碼塊中有效。

{
    var a = 1;
    let b = 2;
}

console.log(a); // 1
console.log(b); // b is not defined b未定義

這就說明let定義的變量只在對(duì)應(yīng)的代碼塊中有效。
同樣的下面是個(gè)for循環(huán)

for(let i = 0; i < 5; i++){
    // ...
}
console.log(i);// i is not defined i未定義

i只在循環(huán)體內(nèi)有效。
阮一峰老師的文章中有一個(gè)例子我們看一下并且分析一下

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

老師給我們的分析是這樣子的:

上面代碼中,變量i是let聲明的,當(dāng)前的i只在本輪循環(huán)有效,所以每一次循環(huán)的i其實(shí)都是一個(gè)新的變量,所以最后輸出的是6。你可能會(huì)問,如果每一輪循環(huán)的變量i都是重新聲明的,那它怎么知道上一輪循環(huán)的值,從而計(jì)算出本輪循環(huán)的值?這是因?yàn)?JavaScript 引擎內(nèi)部會(huì)記住上一輪循環(huán)的值,初始化本輪的變量i時(shí),就在上一輪循環(huán)的基礎(chǔ)上進(jìn)行計(jì)算。
如果還不理解的話我們可以再看一個(gè)例子:
var a = [];
for (let i = 0; i < 10; i++) {
  let val = i;
  a[i] = function () {
    console.log(val);
  };
}
a[6](); // 6

這時(shí)候你就會(huì)理解原因了,就相當(dāng)于for循環(huán)中的執(zhí)行體,每次的執(zhí)行都位于一個(gè)多帶帶的代碼塊中。這個(gè)val是我們顯示定義的一個(gè)副本,當(dāng)我們執(zhí)行a[6]的時(shí)候,他會(huì)找到a[6]保存的函數(shù)的執(zhí)行環(huán)境下去找這個(gè)val,數(shù)組a中的每個(gè)元素都位于一個(gè)多帶帶的代碼塊中互不影響。那么我們可以得出一個(gè)結(jié)論:js引擎會(huì)為我們for循環(huán)中每次循環(huán)的代碼塊保存一個(gè)副本。
Nicholas C. Zakas《深入理解ES6》中也有相關(guān)解釋。
不存在變量提升

console.log(a);// undefined
console.log(b);// b is not defined
var a = 1;
let b = 2;

暫時(shí)性死區(qū)
只要塊級(jí)作用域中存在let命令,那么let聲明的變量就會(huì)綁定這個(gè)作用域不受外部影響。

var temp = "hello";
if(true){
    console.log(temp);// temp is not defined
    let temp;
}
原因就是let綁定了塊級(jí)作用域并且let定義的變量不會(huì)提升,就是這個(gè)地盤跟我同名的都得死。
隱蔽的死區(qū)
function test(x = y, y = 2) {
    return [x, y];
}
test();// 報(bào)錯(cuò)

原因是:當(dāng)執(zhí)行test()的時(shí)候會(huì)先將y的值賦給x作為初始值,但此時(shí)y不存在,所以報(bào)錯(cuò)。

function test(x = 2, y = x) {
    return [x, y];
}
test();// [2, 2]

這樣就沒問題了。

總之,暫時(shí)性死區(qū)的本質(zhì)就是,只要一進(jìn)入當(dāng)前作用域,所要使用的變量就已經(jīng)存在了,但是不可獲取,只有等到聲明變量的那一行代碼出現(xiàn),才可以獲取和使用該變量。

不允許重復(fù)聲明
let不允許在同一作用域聲明兩個(gè)相同的變量。

let a;
var a;//報(bào)錯(cuò)  a已經(jīng)被聲明了
function fun(params) {
    let params;
}
func();//報(bào)錯(cuò)  params已經(jīng)被聲明了
function test(params) {
    {//內(nèi)部代碼塊
        let params;
    }
}
test();//正常執(zhí)行  執(zhí)行函數(shù)內(nèi)部的代碼塊被其中的那個(gè)變量占用了而已

塊級(jí)作用域
先看一下es5,es5只有全局作用域和函數(shù)作用域。

var name = "Jason";
function test() {
    console.log(name);
    if(false) {
        var name = "Nico";
    }
}
==>相當(dāng)于
var name = "Jason";
function test() {
    var name;//變量提升
    console.log(name);
    if(false) {
        name = "Nico";
    }
}
所以執(zhí)行test()會(huì)打印undefined

還有就是for循環(huán)的時(shí)候i的定義被提前

for(var i = 0; i < 3; i++) {
    console.log(i);
}
console.log(i);
依次打印0 1 2 3

原因是i定義被提前,如下:

var i;
for(i = 0; i < 3; i++) {
    console.log(i);
}
console.log(i);

es6出現(xiàn)了塊級(jí)作用域

function test() {
    let n = 0;
    if(true) {
        let n = 1;
    }
    console.log(n);
}
test();// 0

外層的塊級(jí)作用域不受內(nèi)層的控制。

{
    {
        let a = 1;
    }
    console.log(a);//報(bào)錯(cuò) a未被定義
}

外層作用域無法訪問內(nèi)層作用域定義的變量

{
    let a = 0;
    {
        let a = 1;
    }
}

內(nèi)層作用域可以命名外層已經(jīng)命名的變量。
值得提醒的是函數(shù)在塊級(jí)作用域中的聲明

function test() {
    console.log("outside");
}
(function() {
    if(false) {
        function test() {
            console.log("inside");
        }
    }
    console.log(test());
})();

ES5會(huì)打印inside字符串,ES6卻會(huì)報(bào)test is not a function的錯(cuò)。
是不是很詫異,為什么ES6沒有打印outside呢?

原因是:ES6中允許塊級(jí)作用域中聲明函數(shù),但是函數(shù)聲明會(huì)類似于var提升到全局作用域或者函數(shù)作用域頭部,同時(shí)函數(shù)聲明會(huì)提升到塊級(jí)作用域頭部,所以上面的代碼就相當(dāng)于
function test() {
    console.log("outside");
}
(function() {
    var test = undefined;
    if(false) {
        function test() {
            console.log("inside");
        }
    }
    console.log(test());
})();
所以才會(huì)報(bào)test is not a function的錯(cuò)誤。

所以盡量避免塊級(jí)作用域中聲明函數(shù),如果有必要的話可以使用函數(shù)表達(dá)式。

function test() {
    console.log("outside");
}
(function() {
    if(false) {
        let test = function() {
            console.log("inside");
        }
    }
    console.log(test());// outside
})();

const命令
用于定義常量,一旦定義必須立刻初始化不然報(bào)錯(cuò),定義后無法改變值,改變也會(huì)報(bào)錯(cuò)。

const USER_NAME;//報(bào)錯(cuò)
const USER_ID = "410100";
USER_ID = 2;//報(bào)錯(cuò)

const的作用域與let命令相同:只在聲明所在的塊級(jí)作用域內(nèi)有效
const命令聲明的常量也是不提升,同樣存在暫時(shí)性死區(qū),只能在聲明的位置后面使用。
const聲明的常量,也與let一樣不可重復(fù)聲明。
const其實(shí)保證的是變量存儲(chǔ)的內(nèi)存地址不得改動(dòng),對(duì)于簡(jiǎn)單的數(shù)據(jù)類型(數(shù)值,布爾,字符串),值就存在內(nèi)存地址指向的位置,就等同于常量。但是對(duì)于數(shù)組、對(duì)象保存的就是一個(gè)指針,只能保證這個(gè)指針不被改變。對(duì)于內(nèi)部的數(shù)據(jù)結(jié)構(gòu)的變化是無法控制的。

const ARR = [];
ARR.push(1);// 可以執(zhí)行
ARR.length = 0;// 可以執(zhí)行
ARR = [];//報(bào)錯(cuò)
const OBJ = {};
OBJ.name = "JASON";// 可以執(zhí)行
OBJ = {};//報(bào)錯(cuò)

ES6 聲明變量的六種方法:var function let const import class

頂層對(duì)象:瀏覽器中指window Node中指global
ES5的時(shí)候全局變量的賦值與頂層變量的賦值是同一件事。
ES6改變了這一點(diǎn)除了varfunction還保持原來的方式,新的聲明變量的方法不再與頂層變量掛鉤。

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

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

相關(guān)文章

  • es6學(xué)習(xí)之letconst命令

    摘要:和命令命令是在它所在的代碼塊有效,它屬于塊級(jí)作用域,新增。只有全局作用域和函數(shù)作用域。 let和const命令 let命令是在它所在的代碼塊有效,它屬于塊級(jí)作用域,es6新增。es5只有全局作用域和函數(shù)作用域。let命令存在暫時(shí)性死區(qū)(TDZ),即在申明前使用就會(huì)報(bào)錯(cuò),不存在變量提升 console.log(a); // 報(bào)錯(cuò) let a = 111; ==let不允許在相同作用域中,...

    DrizzleX 評(píng)論0 收藏0
  • ES6學(xué)習(xí)之 -- Set數(shù)據(jù)結(jié)構(gòu)

    摘要:類似于數(shù)組,但是中不存在重復(fù)元素??梢越邮芤粋€(gè)數(shù)組或者其他具有接口的數(shù)據(jù)結(jié)構(gòu)作為參數(shù)從上面的代碼可以看出有去重的功能。去重還有另一個(gè)方法將數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)轉(zhuǎn)換成數(shù)組。清除實(shí)例的指定成員。返回一個(gè)布爾值,表示某個(gè)值是否在實(shí)例之中。 Set Set類似于數(shù)組,但是Set中不存在重復(fù)元素。Set可以接受一個(gè)數(shù)組(或者其他具有itarable接口的數(shù)據(jù)結(jié)構(gòu))作為參數(shù) const set = ne...

    wawor4827 評(píng)論0 收藏0
  • ES6學(xué)習(xí)之 -- 解構(gòu)(使數(shù)據(jù)訪問更便捷)

    摘要:數(shù)組的解構(gòu)賦值規(guī)定允許按照一定模式,從數(shù)組和對(duì)象中提取值對(duì)變量進(jìn)行賦值,我們稱之為解構(gòu)。的規(guī)則是,只要有可能導(dǎo)致解構(gòu)的歧義,就不得使用圓括號(hào)。 數(shù)組的解構(gòu)賦值 ES6規(guī)定:允許按照一定模式,從數(shù)組和對(duì)象中提取值對(duì)變量進(jìn)行賦值,我們稱之為解構(gòu)。以前賦值只能直接指定值 let a = 1; let b = 2; let c = 3; ES6允許以下這種做法 let [a, b, c] = ...

    mrcode 評(píng)論0 收藏0
  • NodeAPI學(xué)習(xí)之Buffer

    摘要:與字符編碼通過指定的編碼進(jìn)制,可以在與普通的字符串之間轉(zhuǎn)換。中文中文通常用于實(shí)例數(shù)組的排序。有點(diǎn)像方法合并截?cái)酁榈拈L(zhǎng)度,缺少的部分會(huì)用補(bǔ)充,是一個(gè)返回,是一個(gè)支持的字符編碼返回,創(chuàng)建并返回一個(gè)形式的迭代器,如果與具有完全相同的字節(jié)就返回 Buffer 可以在TCP流或者文件系統(tǒng)操作等場(chǎng)景中處理二進(jìn)制數(shù)據(jù)流。 Buffer實(shí)例類似于整數(shù)數(shù)組,但是Buffer大小固定、且在V8堆外分配物理...

    Integ 評(píng)論0 收藏0
  • node 核心模塊學(xué)習(xí)之 Buffer

    摘要:核心模塊學(xué)習(xí)之何為在引入之前,沒有能讀取和操作二進(jìn)制數(shù)據(jù)流的機(jī)制,作為引入,以便能和網(wǎng)絡(luò)流文件流等進(jìn)行交互。返回值寫入的實(shí)際大小,沒有足夠的空間保存,只會(huì)寫入一部分。返回值實(shí)際存入的字節(jié)數(shù)。參考文章一進(jìn)階核心模塊常用使用總結(jié) node 核心模塊學(xué)習(xí)之Buffer 何為 Buffer 在ES6引入 TypeArray 之前,JS沒有能讀取和操作二進(jìn)制數(shù)據(jù)流的機(jī)制,Buffer 作為 No...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<