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

資訊專欄INFORMATION COLUMN

es6基礎(chǔ)0x002:var、let、const、塊級(jí)作用域、暫存死區(qū)

scola666 / 1023人閱讀

摘要:但是如果使用,作用域塊級(jí)作用域內(nèi),在還沒使用聲明一個(gè)變量的時(shí)候,訪問該變量,將會(huì)獲得,從作用域開始到語句之間,就是暫存死區(qū)。

0x001 var

語法

var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];

使用

var a, b=2 // 聲明多個(gè)變量,可以賦值,也可以不賦值
a=1 // 先聲明,再賦值

var變量提升
使用var聲明的變量將會(huì)被提升到函數(shù)的頂部

console.log(a) // undefined
var a =2  
console.log(a) // 2
console.log(b) //Uncaught ReferenceError: b is not defined...

以上代碼相當(dāng)于

var a
console.log(a) // undefined
a=2
console.log(a) // 2
console.log(b) //Uncaught ReferenceError: b is not defined...

0x002 let

語法

let var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]];

使用

let a, b = 2 // 聲明多個(gè)變量,賦值不賦值無所謂
a = 2 // 聲明之后再賦值

不再提升

console.log(a) // Uncaught ReferenceError: a is not defined...
let a=1 

注意:猜測, 使用babel翻譯一下代碼發(fā)現(xiàn),只是let變成了var,所以使用babel轉(zhuǎn)義之后的代碼依舊會(huì)提升

不能重復(fù)聲明

let a=1
let a=2 // Uncaught SyntaxError: Identifier "a" has already been declared

0x003 const

語言

const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];

使用

const a=1, b=2 // 不能省略的值

不能省略的值

const c // Uncaught SyntaxError: Missing initializer in const declaration

不能重復(fù)賦值

const d=4
d=5 // Uncaught TypeError: Assignment to constant variable.

可以修改的引用

const e=[]
e[0]=0
console.log(e) //[0]

0x004 塊級(jí)作用域

塊級(jí)作用域是隨著let、const而來最有用的特性了,在之前的js中,js的作用域是函數(shù)級(jí)的,由此帶來的幾個(gè)臭名昭著的問題:

意外被修改的值

function varTest() {
  var x = 1;
  if (true) {
    var x = 2;  // 同樣的變量!
    console.log(x);  // 2
  }
  console.log(x);  // 2
}

可以使用let避免了

function letTest() {
  let x = 1;
  if (true) {
    let x = 2;  // 不同的變量
    console.log(x);  // 2
  }
  console.log(x);  // 1
}

萬惡的for循環(huán)和點(diǎn)擊事件

var list = document.getElementById("list");

for (var i = 0; i < 5; i++) {
  var item = document.createElement("LI");
  item.appendChild(document.createTextNode("Item " + i));

  item.onclick = function (ev) {
    console.log("Item " +i + " is clicked.");
  };
  list.appendChild(item);
}
console.log(i) // 5

如果點(diǎn)擊上面,不管點(diǎn)擊哪個(gè),顯示出來的都是Item 5 is clicked.,雖然可以使用閉包解決,但是現(xiàn)在有了更好的方案

let list = document.getElementById("list");

for (let i = 0; i < 5; i++) {
  let item = document.createElement("LI");
  item.appendChild(document.createTextNode("Item " + i));

  item.onclick = function (ev) {
    console.log("Item " +i + " is clicked.");
  };
  list.appendChild(item);
}

0x005 作用域規(guī)則很簡單

{}塊內(nèi)形成一個(gè)作用域,包括if、else、while、class、do...while{}、function

{
    const f=6
}
console.log(f) // Uncaught ReferenceError: f is not defined

for循環(huán)中用let聲明一個(gè)初始因子,該因子在每個(gè)循環(huán)內(nèi)都是一個(gè)新的作用域

for (let i = 0; i < 10; i++) {
  console.log(i);
}
console.log(i) // Uncaught ReferenceError: i is not defined

switch只有一個(gè)作用域

switch (x) {
  case 0:
    let foo;
    break;
    
  case 1:
    let foo; 
    break;
}
// Uncaught SyntaxError: Identifier "foo" has already been declared

0x006 暫存死區(qū)-Temporal Dead Zone-TDZ

隨著letconst的引入,也引入了暫存死區(qū)的概念。使用var的時(shí)候,作用域內(nèi)(函數(shù)作用域),在還沒使用var聲明一個(gè)變量的時(shí)候,訪問該變量,將會(huì)獲得undefined。但是如果使用let,作用域(塊級(jí)作用域)內(nèi),在還沒使用let聲明一個(gè)變量的時(shí)候,訪問該變量,將會(huì)獲得ReferenceError,從作用域開始到let語句之間,就是暫存死區(qū)。

{
 console.log(a) // Uncaught ReferenceError: a is not defined
 console.log(b) // Uncaught ReferenceError: b is not defined
 console.log(c) // undefined
 // 暫存死區(qū)
 let a =1
 const b=2
 var c=3
}

注意:猜測, 使用babel翻譯一下代碼發(fā)現(xiàn),只是let變成了var,所以使用babel轉(zhuǎn)義之后可能不存在暫存死區(qū)

0x007 總結(jié)

盡量使用letconst,如果希望改變該變量的值,則使用let,如果希望不再改變該變量的值或者引用,則使用const,讓var成為歷史。

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

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

相關(guān)文章

  • javascript基礎(chǔ)varlet、const

    摘要:全局作用域在最頂層聲明的變量成為全局變量,全局變量擁有全局作用域,它們在程序的任何地方都是能夠被訪問到。作用域的主要作用是能夠控制變量是使用范圍。程序?qū)?huì)被中斷,這個(gè)特性被稱為暫存死區(qū)。 1. 變量聲明、初始化 Javascript中使用一個(gè)變量之前需要先聲明,我們可以使用var、let、const來聲明一個(gè)變量。如果在給聲明的變量指定初始值,就是初始化。如: var a = 1; ...

    lindroid 評(píng)論0 收藏0
  • ES6簡單了解

    摘要:報(bào)錯(cuò)塊級(jí)作用域明確允許在塊級(jí)作用域中聲明函數(shù)。但其值是固定的,不可更改,只讀。一旦聲明變量,就必須立即初始化,不能留到以后賦值。調(diào)用函數(shù)會(huì)返回一個(gè)內(nèi)部指針,執(zhí)行它不會(huì)返回結(jié)果返回的是指針對(duì)象。 ES6初步學(xué)習(xí) let和const let 用來聲明變量,但是所聲明的變量只在let命令所在的代碼塊內(nèi)有效 let不像var那樣會(huì)發(fā)生變量提升,所以一定要先聲明后使用。 console.log...

    K_B_Z 評(píng)論0 收藏0
  • ES6語法詳解(一)

    摘要:凍結(jié)對(duì)象可以使用方法。對(duì)象的解構(gòu)賦值必須要屬性名相同,順序毫無影響。數(shù)組解構(gòu)賦值默認(rèn)值,當(dāng)?shù)忍?hào)右邊的值時(shí),默認(rèn)值生效。 let變量 let聲明的變量在let命令所在的代碼塊中有效。不存在變量提升,只能先聲明后使用。 暫存死區(qū) 如果區(qū)塊中存在let和const命令,這個(gè)區(qū)塊對(duì)這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量。 var a = 1; { ...

    wendux 評(píng)論0 收藏0
  • ES6新特性--var、let、const

    摘要:不存在塊級(jí)作用域,具有變量提升機(jī)制。在同一作用域內(nèi)只能聲明一次。注意其針對(duì)的是和所在的塊級(jí)作用域。在編程過程中如果需要變量提升則使用聲明變量,否則采用和聲明變量,以便更好地控制作用域,避免變量的混用不可控。 1、 var、let、const var不存在塊級(jí)作用域,具有變量提升機(jī)制。 let和const存在塊級(jí)作用域,不存在變量提升。在同一作用域內(nèi)只能聲明一次。 ## var的說明 #...

    qingshanli1988 評(píng)論0 收藏0
  • ES6系列文章 塊級(jí)作用

    摘要:聲明之函數(shù)作用域和全局作用域。塊級(jí)作用域不能重復(fù)聲明臨時(shí)性死區(qū)等特性用來解決變量存在的種種問題。塊級(jí)作用域終于在外面訪問不到了。一些常量聲明使用聲明的變量名全部大寫。 ES5之前javascript語言只有函數(shù)作用域和全局作用域,使用var來聲明變量,var聲明的變量還存在變量提升使人困惑不已。我們先來復(fù)習(xí)一下ES5的var聲明,再對(duì)比學(xué)習(xí)let和const 。 var var聲明之函...

    趙連江 評(píng)論0 收藏0

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

0條評(píng)論

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