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

本文详细解析了Javascript中的三种作用域:全局作用域、函数作用域及ES6新增的块级作用域。对比了var、let和const声明变量的区别,探讨了变量提升与暂存死区等常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用域

作用域是标识符的可访问范围
在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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值