Es6 let 和 const
基本用法
let a = 10 console.log(a) //10 // 代碼塊內(nèi)執(zhí)行 { let b = 5 console.log(b) // 5 }
for循環(huán)內(nèi)也是比較試用
for (let i =0;i<3;i++) { console.log(i) // 0,1,2 }
Es6 let命令只在所在的代碼塊內(nèi)使用(塊級(jí)作用域)
例1 使用let在函數(shù)代碼塊內(nèi)使用,Es5中是沒有塊級(jí)作用域的,Es6中的let實(shí)際上是為Javascript新增了塊級(jí)作用域,其實(shí)在聲明a為10的代碼塊中則為一個(gè)塊級(jí)作用域,if代碼塊中也是塊級(jí)作用域,這就表明了現(xiàn)在有兩個(gè)塊級(jí)作用域,重點(diǎn)來了外層代碼塊不受內(nèi)層代碼塊影響,所以a在不同的地方打印出的結(jié)果不同
function f() { let a = 10 if (1===1) { let a = 5 console.log(a) // 5 } console.log(a) // 10 } f()
例2 這個(gè)循環(huán)的例子let聲明了之后,在循環(huán){}代碼塊內(nèi)都屬于i的塊級(jí)作用域內(nèi),所以在里面怎么打印都會(huì)有結(jié)果,而在循環(huán)外部打印i的結(jié)果則是未定義
for (let i =0;i<3;i++) { console.log(i) // 0,1,2 } console.log(i) // 這樣會(huì)報(bào)錯(cuò) i is not defined
然而var則不一樣,var也是聲明變量,它則在全局范圍內(nèi)有效,讓我們來看看
例1 現(xiàn)在看看var定義了變量,在內(nèi)部可以打印出小于三的每個(gè)結(jié)果,在代碼塊外層同樣可以得到結(jié)果,但是結(jié)果和代碼塊內(nèi)的不一樣,這是因?yàn)橥鈱拥膇是拿到了循環(huán)完成之后的結(jié)果
for (var i =0;i<3;i++) { console.log(i) // 0,1,2 } console.log(i) // 3 為什么會(huì)得到3,是因?yàn)閒or循環(huán)從0開始執(zhí)行,i++,1然后是2,只執(zhí)行2次
例2 這里使用var得到的結(jié)果全是5,我們來分析一下它的執(zhí)行步驟,首先執(zhí)行的函數(shù),聲明變量a為10,if代碼塊,然后再次聲明a為5(內(nèi)層改變外層),打印5,執(zhí)行出代碼塊再次打印a時(shí),此時(shí)a的值已經(jīng)被改變5
function f() { var a = 10 if (1===1) { // 在一個(gè)代碼塊的中變量并不會(huì)覆蓋掉代碼塊外面的變量 var a = 5 console.log(a) // 5 } console.log(a) // 5 } f()
Es6 let 不存在變量提升和暫時(shí)性死區(qū)
例1 測試let不存在變量提升
{ console.log(foo) // 報(bào)錯(cuò)ReferenceError let foo = 1 }
如果存在變量提升的話上面的代碼執(zhí)行應(yīng)該是
{ let a console.log(a) //undefined a=2 }
例2 如果使用let這樣操作執(zhí)行到if會(huì)報(bào)錯(cuò),因?yàn)閘et不存在變量提升
function func() { if (typeof let == "undefined") { } let val = "" }
我們來看看var的變量提升是什么樣的,與let區(qū)別在哪里
例1 var的變量提升(值不提升)
{ console.log(foo) // undefined var foo = 1 }
例2 var變量提升(先判斷后聲明),這樣就不會(huì)報(bào)錯(cuò)
function func() { if (typeof val == "undefined") { } var val = "" }
let 存在的暫時(shí)性死區(qū)社么為let的死區(qū),只要是在let聲明之前則為死區(qū)
let 聲明在同層代碼塊內(nèi),不可以重復(fù)聲明
例1 在一個(gè)函數(shù)內(nèi)聲明相同的變量名,使用let,這樣會(huì)報(bào)錯(cuò),如果使用var就會(huì)報(bào)錯(cuò)
func() function func() { let a = 1 let a = 2 console.log(a, "xx") } 例2 現(xiàn)在我們來看看var的執(zhí)行結(jié)果,var 是可以重復(fù)聲明的 func() function func() { var a = 1 var a = 2 console.log(a, "xx") // 2 }
作用域和函數(shù)聲明
ES5 規(guī)定,函數(shù)只能在頂層作用域和函數(shù)作用域之中聲明,不能在塊級(jí)作用域聲明,接下來我們來看看Es5中沒有塊級(jí)作用域,下面的例子執(zhí)行函數(shù)f()打印出的結(jié)果為I am inside!因?yàn)閕f內(nèi)函數(shù)會(huì)被提升到頂部,然而在es6中理論的結(jié)果為I am outside!,但是會(huì)報(bào)錯(cuò)!
function f() { console.log("I am outside!"); } (function () { if (false) { // 重復(fù)聲明一次函數(shù)f function f() { console.log("I am inside!"); } } f() }())
以上之所以會(huì)在瀏覽器內(nèi)報(bào)錯(cuò)因?yàn)樵贓s6瀏覽器中塊級(jí)作用域的聲明相當(dāng)于var聲明的變量(變量提升),所以我們盡量寫函數(shù)表達(dá)式而不是函數(shù)聲明語句,下面這個(gè)在Es6瀏覽器中得到的結(jié)果則為I am outside!,內(nèi)層作用域不影響外層作用域,如果將let 替換成 var 將還是會(huì)報(bào)錯(cuò)!
function f() { console.log("I am outside!"); } (function () { if (false) { // 重復(fù)聲明一次函數(shù)f let f = function f() { console.log("I am inside!"); } } f() }()) 例1 創(chuàng)建函數(shù)有兩種方法一種是表達(dá)式,一種是函數(shù)聲明,下面的去掉foo的代碼會(huì)正常執(zhí)行,這就是區(qū)別 function test() { foo() // foo not fun bar() var foo = function () { // 變量提升 alert("this won"t run!"); } function bar() { alert("this will run!"); } } test()
const聲明只讀常量,常量一旦聲明就不能改變,與變量的區(qū)別就在上面
//const一旦聲明變量,就必須立即初始化,不能留到以后賦值。 const foo //const命令聲明的常量也是不提升,同樣存在暫時(shí)性死區(qū),只能在聲明的位置后面使用 console.log(a) // 會(huì)報(bào)錯(cuò) const a = 1 // const聲明的常量,也與let一樣不可重復(fù)聲明,以下都會(huì)報(bào)錯(cuò) const b = 1 const b = 2 // 正確的聲明只需聲明一次 const c = 1 console.log(c) //1 它的本質(zhì)說白了就是指向內(nèi)存的數(shù)據(jù)不得改的,但是還有另一種情況 const foo = {}; // 為 foo 添加一個(gè)屬性,可以成功 foo.prop = 123; foo.prop = 321; console.log(foo.prop); // 321 foo = {} // 就會(huì)報(bào)錯(cuò),不能把foo指向另一個(gè)地址,但對(duì)象本身是可變的,所以依然可以為其添加新屬性。 Es6聲明變量的6種方法(var,function (es5)),let,const, import, class
頂層對(duì)象window和global對(duì)象(這里可以看看文檔就行,最重要的可以多看看this)
瀏覽器window:Es6中的六種方法聲明的變量,使用window都可以拿到,因?yàn)轫攲訉?duì)象的屬性與全局變量是等價(jià)的 global:ES5 的頂層對(duì)象,本身也是一個(gè)問題,因?yàn)樗诟鞣N實(shí)現(xiàn)里面是不統(tǒng)一的。 瀏覽器里面,頂層對(duì)象是window,但 Node 和 Web Worker 沒有window。 瀏覽器和 Web Worker 里面,self也指向頂層對(duì)象,但是 Node 沒有self。 Node 里面,頂層對(duì)象是global,但其他環(huán)境都不支持。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/100247.html
摘要:入門一前言由于最近本人在學(xué)習(xí),做一些筆記能夠更好的熟悉,就趁此機(jī)會(huì)來寫一篇關(guān)于的新人學(xué)習(xí)摘要吧。的作用域與命令相同只在聲明所在的塊級(jí)作用域內(nèi)有效。塊級(jí)作用域新增方式和實(shí)際上為新增了塊級(jí)作用域。同時(shí),函數(shù)聲明還會(huì)提升到所在的塊級(jí)作用域的頭部。 ECMAScript6/ES6 入門 一、前言 由于最近本人在學(xué)習(xí)ES6,做一些筆記能夠更好的熟悉,就趁此機(jī)會(huì)來寫一篇關(guān)于ES6的新人學(xué)習(xí)摘要吧。...
摘要:的作用域與命令相同只在聲明所在的塊級(jí)作用域內(nèi)有效。數(shù)值和布爾值的解構(gòu)賦值解構(gòu)賦值時(shí),如果等號(hào)右邊是數(shù)值和布爾值,則會(huì)先轉(zhuǎn)為對(duì)象。上面代碼中,數(shù)值和布爾值的包裝對(duì)象都有屬性,因此變量都能取到值。默認(rèn)值解構(gòu)賦值允許指定默認(rèn)值。 最近正在學(xué)習(xí)ES6,對(duì)于ES6的語法有一些自己的理解, 想寫這篇文章幫助跟我一樣的新手快速入門ES6而不至于連代碼都看不懂. 至于開發(fā)環(huán)境的搭建什么...
摘要:塊級(jí)作用域綁定變量聲明的變量聲明與其他的一些計(jì)算機(jī)語言不同,在類的語言中,變量總是在被聲明的地方創(chuàng)建而在中變量創(chuàng)建的位置取決于你如何聲明它,為我們提供了新的聲明方式用來讓開發(fā)者能夠更好的控制變量的作用域我們通過聲明的變量,無論其聲明位置在哪 塊級(jí)作用域綁定 1.變量聲明 JS的變量聲明與其他的一些計(jì)算機(jī)語言不同,在類C的語言中,變量總是在被聲明的地方創(chuàng)建;而在JS中變量創(chuàng)建的位置取決于...
摘要:感覺對(duì)我這種沒實(shí)習(xí)沒工作的新手,雖然一些高級(jí)的功能暫時(shí)用不上,但是一些基礎(chǔ)的知識(shí)還是為平時(shí)的開發(fā)提供了巨大的便利。學(xué)習(xí)告一段落,現(xiàn)在結(jié)合平時(shí)的開發(fā),總結(jié)一些常用的知識(shí)。日常開發(fā)中,塊級(jí)作用域中使用的變量,盡量使用或者聲明。使用時(shí),進(jìn)行合并。 很早之前就學(xué)過TypeScript和ES6,后來做項(xiàng)目的時(shí)候零零散散用了些。這幾天又系統(tǒng)地把ES6的知識(shí)看了一遍。感覺對(duì)我這種沒實(shí)習(xí)沒工作的新手,...
摘要:話不多說,先來一張我科的圖坐鎮(zhèn)資訊小程序出來啦作為一個(gè)剛接觸小程序不久的前端小白菜,恰逢最近如火如荼的雙搶七大戰(zhàn)騎士與勇士又又又又又一次的巔峰對(duì)決實(shí)話真的看膩了決定寫一個(gè)資訊的小程序來玩玩。 showImg(https://segmentfault.com/img/remote/1460000015202389?w=580&h=580);話不多說,先來一張我科的圖坐鎮(zhèn) NBA資訊小程序...
閱讀 3503·2021-11-22 15:22
閱讀 2511·2021-09-06 15:00
閱讀 958·2020-06-22 14:39
閱讀 3776·2019-08-30 15:56
閱讀 1606·2019-08-30 12:55
閱讀 3463·2019-08-29 17:19
閱讀 3294·2019-08-26 11:41
閱讀 699·2019-08-23 17:14