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