摘要:和沒有變量提升類似這些功能主要是為了減少程序運(yùn)行時(shí)的錯(cuò)誤使代碼更加規(guī)范不允許重復(fù)聲明同一個(gè)作用域內(nèi)不允許重復(fù)聲明同一個(gè)變量。
let 和 var
相信有很多前端工程師除了在聲明函數(shù)時(shí)會用到 function 其余的變量聲明一律使用 var, 不過隨著瀏覽器對es6逐漸支持我們應(yīng)該學(xué)著使用 let 和 const 而不是使用存在諸多弊端的 var
var 存在著哪些弊端呢?
沒有塊級作用域,很容易聲明全局變量
變量提升
可以重復(fù)聲明
典型的面試題
var arr = []; for (var i = 0; i < 10; i++) { arr[i] = function () { console.log(i); } } arr[6](); // 期望輸出 6 實(shí)際輸出 10 arr[7](); // 期望輸出 7 實(shí)際輸出 10 arr[8](); // 期望輸出 8 實(shí)際輸出 10
在ES6誕生之前我們的解決方法基本是這樣的
var arr = []; for (var i = 0; i < 10; i++) { (function (i) { arr[i] = function () { console.log(i); } }(i)) } arr[6](); // 6 arr[7](); // 7 arr[8](); // 8
ES6誕生以后呢
let arr = []; for (let i = 0; i < 10; i++) { arr[i] = function () { console.log(i); } } arr[6](); // 6 arr[7](); // 7 arr[8](); // 8
是不是簡單了很多, 這一切都要?dú)w功于let的塊級作用域, 這里使用 var 聲明的i是全局變量, 當(dāng)for循環(huán)執(zhí)行完成以后, i的值已經(jīng)變成了10, 而在 console.log(i) 的時(shí)候訪問的同樣是全局下的 i 因此我們會發(fā)現(xiàn)無論執(zhí)行哪個(gè)函數(shù) i 的值都是10;
而使用 let 呢, 因?yàn)?let 聲明的變量只在 let 命令所在的代碼塊內(nèi)有效, 所以每一次循環(huán)的i其實(shí)都是一個(gè)新的變量, 而當(dāng)執(zhí)行 console.log(i) 時(shí), js會沿著作用域鏈?zhǔn)紫日业阶罱?i 并輸出, 因此會輸出我們所期望的 i 值.
除了存在塊級作用域 相對于 var 不同之處還有
不存在變量提升
console.log(a); // undefined; var a = 1; console.log(b); // b is not defined let b = 2;
這里用 var 聲明變量時(shí), 因?yàn)榇嬖谧兞刻嵘? 在聲明之前訪問該變量會輸出 undefined 并不會報(bào)錯(cuò), 而使用 let 聲明的變量在聲明之前訪問則會報(bào)錯(cuò), 這樣更符合人的常規(guī)邏輯.
暫時(shí)性死區(qū)
var a = 123; if (true) { a = "abc"; // a is undefined; let a; }
暫時(shí)性死區(qū)規(guī)定在聲明之前就使用這些變量,就會報(bào)錯(cuò)。和沒有變量提升類似, 這些功能主要是為了減少程序運(yùn)行時(shí)的錯(cuò)誤, 使代碼更加規(guī)范.
不允許重復(fù)聲明
let c = 2; let c = 3; // Identifier "c" has already been declared
同一個(gè)作用域內(nèi) 不允許重復(fù)聲明同一個(gè)變量。
不會成為全局對象(window)的屬性
var a = 3; console.log(window.a); // 3 let b = 4; console.log(window.b); // undefined;const
除了 let 有時(shí)候我們也許更需要 const
const 和 let 的唯一區(qū)別就是,const 不可以被更改,所以當(dāng)聲明變量的時(shí)候,尤其是在聲明容易被更改的全局變量的時(shí)候,盡量使用 const。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/108286.html
摘要:概述發(fā)布前,只能通過聲明變量的方式,常量塊級變量函數(shù)變量這些概念的差別都不能很好的體現(xiàn)出來,于此同時(shí),加入你要使用或者提供一個(gè),聲明的變量可隨時(shí)被修改和重新分配的問題,會讓你時(shí)刻擔(dān)心代碼是否能正常運(yùn)行。 1. var、let、const概述 ES6發(fā)布前,Javascript只能通過var聲明變量的方式,常量、塊級變量、函數(shù)變量這些概念的差別都不能很好的體現(xiàn)出來,于此同時(shí),加入你要使用...
showImg(https://segmentfault.com/img/remote/1460000017757580); let和const是 ES6 新增的命令,用于聲明變量,這兩個(gè)命令跟 ES5 的var有許多不同,并且let和const也有一些細(xì)微的不同,再認(rèn)真閱讀了阮一峰老師的文檔后,發(fā)現(xiàn)還是有一些不知道的細(xì)節(jié)... 博客、前端積累文檔、公眾號、GitHub 內(nèi)容: var和let...
摘要:聲明的變量存在變量提升,聲明的變量不存在變量提升。聲明的變量允許重新賦值,聲明的變量不允許重新賦值。注意跨腳本聲明重復(fù)變量也會報(bào)錯(cuò)。中出現(xiàn)的任何元素在聲明中出現(xiàn),語法錯(cuò)誤。中的是如此的怪異。對中的聲明進(jìn)行實(shí)例化。 我在上一篇文章javascript中詞法環(huán)境、領(lǐng)域、執(zhí)行上下文以及作業(yè)詳解中的最后稍微提到了有關(guān)var、let、const聲明的區(qū)別,在本篇中我會重點(diǎn)來分析它們之間到底有什么...
摘要:聲明變量不存在變量提升。臨時(shí)死區(qū),而且不能在聲明之前訪問它。禁止重復(fù)聲明相同的變量,否則報(bào)錯(cuò)。不存在變量提升,一旦執(zhí)行快外就會立即銷毀。聲明不允許修改綁定,但允許修改值,也就是說用創(chuàng)建對象后,可以修改該對象的屬性值。 知識點(diǎn) var 聲明變量: 1、存在變量提升,實(shí)際上var無論在哪里聲明,都會被當(dāng)做當(dāng)前的作用域頂部聲明變量。 2、可以重復(fù)聲明,后聲明的變量會覆蓋前聲明的變量。 let...
摘要:命令新增了命令,跟類似,都是用來聲明變量的不允許重復(fù)聲明報(bào)錯(cuò)不存在變量提升報(bào)錯(cuò)正確寫法為既要先定義,后面才能有這個(gè)值,否則會報(bào)錯(cuò),如果改成會提示未定義,但是就直接報(bào)錯(cuò)了暫時(shí)性死區(qū)只要在塊級作用域里面存在則它所聲明的變量就綁定在這個(gè)塊級作用域 let命令 ES6新增了let命令,跟var類似,都是用來聲明變量的 1.不允許重復(fù)聲明 { let a = 1; let a =...
摘要:塊級作用域存在于函數(shù)內(nèi)部塊中字符和之間的區(qū)域和塊級聲明用于聲明在指定塊的作用域之外無法訪問的變量。和都是塊級聲明的一種。值得一提的是聲明不允許修改綁定,但允許修改值。這意味著當(dāng)用聲明對象時(shí)沒有問題報(bào)錯(cuò)臨時(shí)死區(qū)臨時(shí)死區(qū),簡寫為。 塊級作用域的出現(xiàn) 通過 var 聲明的變量存在變量提升的特性: if (condition) { var value = 1; } console.lo...
閱讀 1334·2021-11-11 11:00
閱讀 3064·2021-09-24 09:47
閱讀 4990·2021-09-22 15:53
閱讀 971·2021-09-10 10:50
閱讀 3214·2021-09-01 11:40
閱讀 1174·2019-08-30 15:55
閱讀 480·2019-08-30 12:49
閱讀 1059·2019-08-29 17:12