成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

marser / 965人閱讀

摘要:命令用來聲明變量,它的用法類似,但是命令聲明的變量只在所在的代碼塊中有效。不允許重復(fù)聲明不允許在同一作用域聲明兩個相同的變量。對于內(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定義的變量只在對應(yīng)的代碼塊中有效。
同樣的下面是個for循環(huán)

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

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

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

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

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

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

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

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

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

這樣就沒問題了。

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

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

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

塊級作用域
先看一下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()會打印undefined

還有就是for循環(huán)的時候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)了塊級作用域

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

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

{
    {
        let a = 1;
    }
    console.log(a);//報錯 a未被定義
}

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

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

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

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

ES5會打印inside字符串,ES6卻會報test is not a function的錯。
是不是很詫異,為什么ES6沒有打印outside呢?

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

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

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

const命令
用于定義常量,一旦定義必須立刻初始化不然報錯,定義后無法改變值,改變也會報錯。

const USER_NAME;//報錯
const USER_ID = "410100";
USER_ID = 2;//報錯

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

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

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

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90573.html

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

    soasme 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<