一、ES6新增了let命令

let 和 var 一样都是用来声明标量,但let所声明的变量只在【声明的代码块内】及【声明之后】有效

{console.log(a);  // undefinedconsole.log(b);  // Uncaught ReferenceError: b is not defined(…)var a = 5;let b = 10;
}
console.log(a);  // 5
console.log(b);  // Uncaught ReferenceError: b is not defined(…)

let命令适合在for循环中使用

// i在for循环内有效
for(let i = 0;i < 5;i++){console.log(i); // 0 1 2 3 4
}
console.log(i);    // Uncaught ReferenceError: i is not defined(…)//i在全局内有效
for(var i = 0;i < 5;i++){console.log(i); // 0 1 2 3 4
}
console.log(i);    // 5

let 命令暂时性死区

// 大括号中的a使用了let声明,所以 a在大括号中暂时只能在声明之后有效
var a = 5;
{console.log(a); // Uncaught ReferenceError: a is not defined(…)typeof a;       // Uncaught ReferenceError: a is not defined(…)let a =10;      console.log(a); // 10
}
console.log(a);     // 5

let不允许在同一作用域内重复声明变量,因此不能在函数内重新声明变量

{let a = 10;var a = 15;  //Uncaught SyntaxError: Identifier 'a' has already been declared
}{var a = 10;var a = 15;        // 不会报错console.log(a);    // 15
}show(10);
function show(arg){let arg = 5;    //Uncaught SyntaxError: Identifier 'arg' has already been declared(…)console.log(arg);
}hide(10);
function hide(arg){{let arg = 5;console.log(arg);  // 5}console.log(arg);      // 10
}

二、ES6新增了块级作用域

ES5只有全局作用域和函数作用域,会出现以下的问题

//1、内层变量覆盖了外层变量
var number = 5;
show();
function show(){console.log(number);      // undefinedvar number = 10 ;
}//2、i泄露成全局变量
var string = 'hello';
for(var i = 0 ;i<string.length ;i++){console.log(string[i]);  // h e l l o
}
console.log(i);              // 5

ES6块级作用域写法(块级作用域可以无限嵌套,可以代替ES5的匿名函数IIFE)

{let number = 5;console.log(number);       // 5{let number = "hello";console.log(number);  // hello}
}

ES5严格模式下,函数不能在块级中声明,ES6明确规定可以在块级作用域中声明函数,但声明的函数有点类似let,在块级作用域之外不可引用,由于浏览器可以忽略以上规则,所以尽量避免在块级作用域中声明函数。

//ES5非严格模式
if(true){function show(){    //不报错};
}
//ES5严格模式
'use strict';
if(true){function show(){    //直接报错};
}//ES6严格模式
'use strict';
if(true){function show(){    //不报错};
}

三、ES6新增了const命令

const 声明的是一个只读的变量,一旦声明,不可更改,这就意味着一旦声明就必须初始化,不然会报错,const作用域和let作用域一样.

const PI;             //Uncaught SyntaxError: Missing initializer in const declaration
const PI = 3.1415926;
console.log(PI);      // 3.1415926;
PI = 4 ;              // Uncaught TypeError: Assignment to constant variable.//const声明的变量也和let一样,不能重复声明
var a = 1;
let b = 2;
const a = 5;    //Uncaught SyntaxError: Identifier 'a' has already been declared
const b = 6 ;   //Uncaught SyntaxError: Identifier 'b' has already been declared//对于复合对象,变量名指向的是数据的地址,const声明的指向的是数据的地址不变,但数据可以变;若要冻结数据,可以使用freeze.
const A = {};
A.props = 123;
console.log(A.props);  // 123
A = {};                // Uncaught TypeError: Assignment to constant variable.const B = Object.freeze({});
B.props = 456;         // 常规模式,该行代码无效,严格模式下会报错
console.log(B.props);  // undefined

全局变量的属性

window.a = 1;
var a = 2 ;
console.log(a);         // 2
console.log(window.a);  // 2window.b = 1;
let b = 2 ;
console.log(b);         // 2
console.log(window.b);  // 1

总结:

ES5 有两种声明变量的方法:var 和 function命令
ES6 有六种声明变量的方法:var 、 function 、let 、const 、import、class命令。

ES6学习笔记一:let、const、块级作用域相关推荐

  1. ES6学习笔记--let和const

    今天开始读阮一峰的<ECMAScript 6 入门>,在这里记录下阅读过程中的要点,以便随时查阅. let和const 顶层对象的属性与全局变量挂钩,被认为是js最大的败笔之一,ES6开始 ...

  2. ES6基础2(块级作用域、数组对象解构)-学习笔记

    文章目录 ES6基础2(块级作用域.数组对象解构)-学习笔记 块级作用域 数组解构 对象解构 字符串解构 函数的参数解构 ES6基础2(块级作用域.数组对象解构)-学习笔记 块级作用域 //let c ...

  3. ES6学习笔记二arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

  4. let、const和var的区别(涉及块级作用域)

    let .const和var的区别 let.const.var在js中都是用于声明变量的,在没有进行ES6的学习前,我基本只会使用到var关键字进行变量的声明,但在了解了ES6之后就涉及到了块级作用域 ...

  5. 详解var、let、const关键词声明变量的区别,以及变量提升、块级作用域的认识等。

    首先回顾一下JavaScript中var声明变量的基础知识: • 在使用var关键词声明变量时,变量在函数外则是全局变量,有全局作用域,全局变量在页面关闭后销毁:变量在函数内则是局部变量,作用局部作用 ...

  6. ES6规范前后块级作用域与函数声明的缠缠绵绵

    今天我们就以上面的这个例子来说一下,块级作用域与函数声明在ES6前后的纠葛,当然在ES6之前是没有块级作用域的,但为了与ES6统一,使文章更简明,所以把这对'{}'统一称为块级作用域. 开正题之前,还 ...

  7. ES6学习笔记02:let 与 const

    ES6学习笔记02:let 与 const 用var声明的变量会造成全局污染,于是就产生了新的声明方式. 1.let 用let声明变量,必须先声明后使用. 在for循环头里用let定义循环变量i,那么 ...

  8. ES6(一)——字面量的增强、解构、let/const、块级作用域、暂时性死区

    一.字面量的增强 ES6中对 对象字面量 进行了增强,称之为 Enhanced object literals(增强对象字面量). 字面量的增强主要包括下面几部分: 属性的简写:Property Sh ...

  9. 搭建Babel运行环境,Traceur ES6模板,块级作用域,let和const命令

    搭建Babel运行环境 Babel(http://babeljs.io/)可用于将使用ES6语法的脚本转化为ES5语法的脚本,基本功能的安装步骤如下: 1.安装node解释器和npm包管理工具 2.安 ...

  10. ES6 学习笔记(一)let,const和解构赋值

    let和const let和const是es6新增的两个变量声明关键字,与var的不同点在于: (1)let和const都是块级作用域,在{}内有效,这点在for循环中非常有用,只在循环体内有效.va ...

最新文章

  1. mysql - AB复制
  2. 物联网技术周报第 141 期: 使用 Alexa Voice 和 Raspberry Pi 构建图片识别应用
  3. MySQL主键学习总结
  4. 【django】配置redis数据库【4】
  5. C#之switch多分支语句
  6. 数据库存带微信表情的昵称
  7. Angular 依赖注入里factory函数的调用时机
  8. 针对12306.cn网站应用架够的一些看法
  9. 回文字符串(51Nod-1092)
  10. 基于STM32构建EtherCAT主站(SOEM方案)5
  11. 不择手段背单词、新东方词根词缀词典、超级新华字典、英语词根词缀记忆大全词典
  12. 区块链开发入门学习线路图
  13. C语言递归函数 计算学生年龄
  14. 计算机鼠标能用键盘不能用,电脑键盘鼠标都不能用了,怎么回事?
  15. 病毒RNA分离:病毒RNA提取试剂盒方案
  16. Spring 事件发布机制@EventListener源码深度解析
  17. 1697_python编程_assertions and exceptions
  18. 【读书笔记】Linux内核完全注释第二章:微型计算机组成结构
  19. 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
  20. php跨平台审计工具,php源码审计工具–PHP Source Auditor 4 released

热门文章

  1. 在Linux(Ubuntu)下编写编译C语言
  2. ENVI入门系列教程---一、数据预处理---4.1 遥感图像正射校正
  3. linux boot 空间不足,解决Ubuntu 提示boot分区空间不足办法
  4. 狂神说Reids完结篇
  5. 一个程序员的爱情和他的小棉袄
  6. 小米手环6NFc支持Android,小米手环6普通版和NFC版有什么区别-哪个好-哪款更值得入手...
  7. 收藏+下载!Flink 社区最全学习渠道汇总
  8. Demo 示例:如何原生的在 K8s 上运行 Flink?
  9. iperf3 网络探测详解(android、iOS、windows)
  10. mui ajax的值php怎样获取,MUI.ajax是怎么获取数据的