ES6 中除了使用 var 定义变量,还有let、const,定义变量。

function getValue(condition){

    console.log(typeof value2);  // undefined,与 if 语句中的 value2 不在同一个作用域中
//console.log(typeof v); //临时死区,需要先定义后使用,ReferenceError: v is not defined
let v = "e";
let value1;
// let value1; // 不能重复声明 SyntaxError: Identifier 'value1' has already been declared
if(condition){
var value = "blue"; // var 声明的变量,会提升为当前作用域的顶部声明的变量
let value2 = "green"; // let 声明的变量,具有块级作用域
value1 = value; }else{
console.log(value);
value1 = "";
}
console.log(value); // 可以访问value
console.log(value2); // 不可以访问value2,ReferenceError: value2 is not defined } getValue(1);

const 声明和 let 声明的 变量都具有块级作用域,并且不能重复声明,声明的变量不会提升至当前作用域顶端。如果在声明之前访问使用const、let声明的变量。

Javascript引擎在扫描代码发现变量声明时,要么将它提升至当前作用域顶部(遇到var 声明),要么将声明放到临时死区(TDZ)中(遇到let 和 const声明)。访问TDZ中的变量会触发运行时错误。只有执行过变量声明语句后,变量才会从TDZ重移除,然后才能访问。

const声明的是常量,不可再修改,但用 const 声明对象时,可以修改其属性。

const person = {
name : "tom"
}
person.name = "Greg";
person = null; //TypeError: Assignment to constant variable.
person = {name: "Greg"}; //TypeError: Assignment to constant variable.

循环中的 let 声明,每次迭代循环都会创建一个新变量,并以之前迭代中同名变量的值将其初始化。for循环和for-in循环中行为一致。

var funcs = [];
for(let i=0; i<10;i++){
funcs.push(function(){
console.log(i);
});
} funcs.forEach(function(func){
func(); // 输出 0、1、....、9
});

const和let 在全局作用域中,会在全局作用域下创建一个新的绑定,但该绑定不会添加为全局对象的属性,不会覆盖全局变量,而只能遮蔽它。

var Array = "hello";
console.log(window.Array); // "hello" var ncz = "Hi!";
console.log(window.ncz); // "Hi!" let RegExp = "Hello!";
console.log(RegExp); // "Hello!"
console.log(window.RegExp === RegExp); // false const ncz1 = "hi";
console.log(ncz1); // "hi"
console.log("ncz1" in window); //false

ES6 let const 声明变量 块级作用域的更多相关文章

  1. ECMAScript概述及浅谈const,let与块级作用域

    ECMAScript可以看作javascript的标准规范,实际上javascript是ECMAScript的一门脚本语言,ECMAScript只提供了最基本的语言JavaScript对ECMAScr ...

  2. ES6入门一:块级作用域(let&const)、spread展开、rest收集

    let声明 const声明 块级作用域 spread/rest 一.let声明与块作用域 在ES6之前,JavaScript中的作用域基本单元就是function.现在有了let就可以创建任意块的声明 ...

  3. 《浏览器工作原理与实践》<09>块级作用域:var缺陷以及为什么要引入let和const?

    在前面我们已经讲解了 JavaScript 中变量提升的相关内容,正是由于 JavaScript 存在变量提升这种特性,从而导致了很多与直觉不符的代码,这也是 JavaScript 的一个重要设计缺陷 ...

  4. 12.24 ES6浅谈--块级作用域,let

    第一部分:ES6新增了块级作用域,let关键字用于声明变量,相较于var而言,let关键字不存在声明提前. 1.ES6真正的出现了块级作用域,使用双花括号括住并在其中用let声明变量,会存在暂时性死区 ...

  5. Javascript高级编程学习笔记(25)—— 函数表达式(3)模仿块级作用域

    昨天写了闭包 今天就来聊聊块级作用域的事情 在绝大多数编程语言中,都有块级作用域这个概念 什么是块级作用域呢? 前面我们在刚开始讲的时候说过,JS中的大括号(不在赋值运算符的后面)表示代码块 块级作用 ...

  6. 从函数作用域和块级作用域看javascript的作用域链

    在ES6之前,javascript只有全局作用域和函数作用域.所谓作用域就是一个变量定义并能够被访问到的范围.也就是说如果一个变量定义在全局(window)上,那么在任何地方都能访问到这个变量,如果这 ...

  7. 01.JS块级作用域与let

    1.块级作用域   什么是:         在一个代码块(括在一对花括号中的一组语句)中定义的所需变量(与let配合使用)并在代码块的外部是不可见的.   为什么:         在ES6之前,函 ...

  8. 混合开发的大趋势之 一个Android程序员眼中的 React.js 块级作用域 和 let

    转载请注明出处:王亟亟的大牛之路 最近都有事干然后,快到月底了这个月给CSDN的博文也就两篇,想想也蛮多天没更了,那就来一篇. 老规矩,先安利:https://github.com/ddwhan012 ...

  9. ES6块级作用域及新变量声明(let)

    很多语言中都有块级作用域,但JS没有,它使用var声明变量,以function来划分作用域,大括号“{}” 却限定不了var的作用域.用var声明的变量具有变量提升(declaration hoist ...

随机推荐

  1. Python全栈之路----常用模块----time模块

    time 模块的方法 time.time():返回当前时间的时间戳. >>> import time >>> time.time() #从1974年到现在过去了多少 ...

  2. mongo 索引,速度

    (如有打扰,请忽略)阿里云ECS大羊群,2U4G低至1.4折,限实名新用户,需要的点吧https://promotion.aliyun.com/ntms/act/vm/aliyun-group/tea ...

  3. 同一台电脑中同时安装oracle database 服务器端和oracle client 客户端时注意

    如果在一台电脑中同时安装oracle的客户端和服务器端软件, 一定要先安装oracle database 服务端,并进行相应的配置 listener.ORA. 然后再去安装oracle client ...

  4. PythonStudy——列表与字典推导式 List and dictionary derivation

    # 快速生成列表或字典的语法糖,且能在生成过程中添加简单的逻辑 # 能被列表推导式推导的数据源必须在循环取值时可以得到一个值 ls = [v for v in range(1, 6)] print(l ...

  5. 【js字符串当做数组来使用】浪费一晚【想出了3个解决方案】

    数据库的所有数据都打成字符串发到前端. 不必把它的类型也强制转成int这类的,页面负责字符串的展示 这样做可以修改页面的数据 response.setHeader("Content-type ...

  6. 集群中节点(Node)与单机数据库的区别

    集群中节点(Node)与单机数据库的区别: 区别项 集群中节点(Node) 单机数据库 只能使用0号数据库 是 都可以使用

  7. spring找不到bean

    有时候明明有bean,spring找不到bean,这时候需要mvn clean下,有时候xml文件不会每次都编译,改了不clean可能不会生效.

  8. django 获取用户提交的数据 文件 表单

    templates: <div> <form action="/detail" method="post" enctype="mul ...

  9. 记录 Ext 日历月份选择控件bug解决过程结果

    目录 背景 代码 背景 项目使用 Ext.NET 2.2.0.40838 , 对应 Ext JS4.2 版本. 结果 2017/3/31 号的时候偶然间点日历选择控件选择2月,10月等月份突然就跳到3 ...

  10. 涂抹mysql笔记-InnoDB/MyISAM及其它各种存储引擎

    存储引擎:一种设计的存取和处理方式.为不同访问特点的表对象指定不同的存储引擎,可以获取更高的性能和处理数据的灵活性.通常是.so文件,可以用mysql命令加载它. 查看当前mysql数据库支持的存储引 ...