ES6中 对块级作用域的理解,以及三种定义变量的方式对块级作用域的影响

作用域

作用域是标识符的可访问范围
在Javascript常用三种作用域(词法环境):

  • 1),全局作用域------全局定义
  • 2), 函数作用域-------在函数内部定义
  • 3), 块级作用域-----ES6新增的,用{}来界定块级作用域。

1,块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。

2,ES6新增了块级作用域,使用let声明的变量有块的概念,var声明的变量则没有块级作域的概念;

if(true){ var num = 100; }
console.log(num);          //正常打印100

if(true){ let age = 60; }
console.log(age);          //报错:age is not defined

注意
var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
let定义的变量, 有块的概念,不能跨块访问,也不能跨函数访问。
const用来定义常量,有块的概念,不能跨块访问,而且不能修改。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三种定义变量的常见问题(变量提升和暂存死区)

1,变量提升(var在定义变量之前进行访问变量时所引起的现象)

  console.log(number);     // undefined
  var number = 1000;
  console.log(number);  // 1000

var声明的变量能够提前使用虽然只是undefined, 我们把这种现象称之为变量提升

2,暂存死区 (let在定义变量之前进行访问变量时所引起的现象)

function do_something() {
  console.log(bar); // undefined
  console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
  var bar = 1;
  let foo = 2;
}
do_something() ;

在这里插入图片描述
与通过 var 声明的有初始化值 undefined 的变量不同,
通过 let 声明的变量直到它们的定义被执行时才初始化。在变量初始化前访问该变量会导致 ReferenceError。该变量处在一个自块顶部到初始化处理的“暂存死区”中。

参考 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/let

作者:糯米团子_大芒果
链接:https://www.jianshu.com/p/6b6b322b6e4d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值