摘要:發布自的博客,歡迎大家轉載,但是要注意注明出處。另外,該文章收納在的個人的知識整理倉庫,歡迎投稿是在加入的新的變量聲明方法,聲明變量的方法和類似的功能是聲明一個作用域被限制在塊級的變量,而聲明的變量的作用域只能是全局的或者整個函數塊的再舉一
發布自Kindem的博客,歡迎大家轉載,但是要注意注明出處。另外,該文章收納在Kindem的個人的 IT 知識整理倉庫,歡迎 Star、Fork、投稿let
let是在ES6加入的新的變量聲明方法,let聲明變量的方法和var類似:
let a = "hello"; var b = "hello";
let的功能是聲明一個作用域被限制在塊級的變量,而var聲明的變量的作用域只能是全局的或者整個函數塊的
function varTest() { var x = 1; if (true) { var x = 2; // 2 console.log(x); } // 2 console.log(x); } function letTest() { let x = 1; if (true) { let x = 2; // 2 console.log(x); } // 1 console.log(x); }
再舉一個例子:
var a = 1; var b = 2; if (a === 1) { var a = 11; let b = 22; // 11 console.log(a); // 22 console.log(b); } // 11 console.log(a); // 2 console.log(b);
另外,如果作用域位于程序的頂層,var會掛載到window上,而let不會:
var a = "a"; let b = "b"; // this -> window // a console.log(this.a); // undefined console.log(this.b); // a console.log(window.a); // undefined console.log(window.b);
在相同的函數或塊作用域內重新聲明同一個變量會引發一個重復定義的SyntaxError
if (x) { let foo; // SyntaxError let foo; }
let和var都會在聲明所在的作用域頂部被創建,這被稱為變量提升,但是不同的是var的創建會伴隨著一個undefined值,在賦值之后才會改變,而let沒有被賦值之前是不會被初始化的,如果在這期間引用let聲明的變量,會導致一個ReferenceError,直到初始化之前,該變量都處于暫存死區:
function test() { // undefined console.log(bar); // ReferenceError console.log(foo); var bar = 1; let foo = 2; } test();
兩個復雜一點的例子:
function test(){ var foo = 33; if (true) { // ReferenceError let foo = (foo + 55); } } test();
function go(n) { // Object {a: [1,2,3]} console.log(n); // ReferenceError for (let n of n.a) { console.log(n); } } go({a: [1, 2, 3]});const
const的基本作用是聲明一個作用域被限制在塊級的常量,其作用域和let一樣,基本使用也和let類似,但是const的特點是const聲明的值一經創建無法被改變
使用const會創建一個值的只讀引用,這意味著const聲明的對象本省的引用是無法被改變的,但是其屬性是可以被改變的,因為改變其屬性并不會引起其引用的變化
下面給出const的一些特性的例子:
基本使用:
const a = "abc";
無法被重復定義:
const a = "abc"; // SyntaxError: Identifier "a" has already been declared const a = "abc";
聲明時就必須賦值:
// SyntaxError: Missing initializer in const declaration const a;
無法被修改:
const a = "a"; // TypeError: Assignment to constant variable a = "b";
塊級作用域:
if (true) { var a = "a"; const b = "b"; // a console.log(a); // b console.log(b); } // a console.log(a); // ReferenceError: not defined console.log(b);
作用域在程序頂層時不會掛在window對象上:
var a = "a"; const b = "b"; // this -> window // a console.log(this.a); // undefined console.log(this.b); // a console.log(window.a); // undefined console.log(window.b);
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97711.html
showImg(https://segmentfault.com/img/remote/1460000017757580); let和const是 ES6 新增的命令,用于聲明變量,這兩個命令跟 ES5 的var有許多不同,并且let和const也有一些細微的不同,再認真閱讀了阮一峰老師的文檔后,發現還是有一些不知道的細節... 博客、前端積累文檔、公眾號、GitHub 內容: var和let...
摘要:外層作用域不報錯正常輸出塊級作用域與函數聲明規定,函數只能在頂層作用域和函數作用域之中聲明,不能在塊級作用域聲明。規定,塊級作用域之中,函數聲明語句的行為類似于,在塊級作用域之外不可引用。同時,函數聲明還會提升到所在的塊級作用域的頭部。 前言:最近開始看阮一峰老師的《ECMAScript 6 入門》(以下簡稱原...
摘要:概述發布前,只能通過聲明變量的方式,常量塊級變量函數變量這些概念的差別都不能很好的體現出來,于此同時,加入你要使用或者提供一個,聲明的變量可隨時被修改和重新分配的問題,會讓你時刻擔心代碼是否能正常運行。 1. var、let、const概述 ES6發布前,Javascript只能通過var聲明變量的方式,常量、塊級變量、函數變量這些概念的差別都不能很好的體現出來,于此同時,加入你要使用...
摘要:聲明的變量存在變量提升,聲明的變量不存在變量提升。聲明的變量允許重新賦值,聲明的變量不允許重新賦值。注意跨腳本聲明重復變量也會報錯。中出現的任何元素在聲明中出現,語法錯誤。中的是如此的怪異。對中的聲明進行實例化。 我在上一篇文章javascript中詞法環境、領域、執行上下文以及作業詳解中的最后稍微提到了有關var、let、const聲明的區別,在本篇中我會重點來分析它們之間到底有什么...
摘要:塊級作用域存在于函數內部塊中字符和之間的區域和塊級聲明用于聲明在指定塊的作用域之外無法訪問的變量。和都是塊級聲明的一種。值得一提的是聲明不允許修改綁定,但允許修改值。這意味著當用聲明對象時沒有問題報錯臨時死區臨時死區,簡寫為。 塊級作用域的出現 通過 var 聲明的變量存在變量提升的特性: if (condition) { var value = 1; } console.lo...
摘要:聲明的變量不得改變值,這意味著,一旦聲明變量,就必須立即初始化,不能留到以后賦值。這在語法上,稱為暫時性死區,簡稱。這表明函數內部的變量與循環變量不在同一個作用域,有各自單獨的作用域。系列文章系列文章地址 showImg(https://segmentfault.com/img/bVbrjjC); 為什么需要塊級作用域 ES5 只有全局作用域和函數作用域,沒有塊級作用域,這帶來很多不合...
閱讀 1879·2021-09-27 13:35
閱讀 3432·2019-08-30 14:16
閱讀 2489·2019-08-30 10:52
閱讀 867·2019-08-29 16:35
閱讀 1420·2019-08-29 15:22
閱讀 3647·2019-08-23 18:21
閱讀 3138·2019-08-23 18:00
閱讀 3127·2019-08-23 16:50