文档章节

JavaScript执行环境及作用域(三)——没有块级作用域

前端二牛
 前端二牛
发布于 2018/12/16 18:26
字数 559
阅读 13
收藏 0

JavaScript中没有块级作用域经常会导致理解上的困惑,在其他类C的语言中,由花括号封闭的代码都有自己的作用域,因而支持根据条件来定义变量。但是在JavaScript中下面的代码并不会得到想象中的结果:

if(true){
    var aa = 'red';
}
console.log(aa);//red

这里在if语句中定义了一个变量aa,如果是在C、C++或Java中,aa会在if语句执行完毕后被销毁。但在JavaScript中,if语句里的变量声明会将变量添加到当前的执行环境,而JavaScript中的执行环境通常只有两种——全局执行环境和局部执行环境,局部执行环境一般就是函数,所以这里的aa是定义在全局执行环境中,也就是作为window对象的属性存在的,如下图:

所以根据作用域链机制会正常打印red

没有块级作用域是个缺点,好在ES6把这个问题解决了,新标准中引入了关键字let,支持了块级作用域,看下面代码:

if(true){
    let aa = 'red';
    console.log(aa);//red
}
console.log(aa);//Uncaught ReferenceError: aa is not defined

改用let声明变量aa,在if块里面可以访问aa,外面就报错了。

由下图也可以看出,aa并没有被声明在window上,而是在全局作用域Global的前端增加了一个Block作用域,而Block正是块的意思,根据作用域链机制可以在if块内部访问到aa

所以如果用的是ES5,那是没法使用块级作用域的。ES6出来有几年了,浏览一下各主流明星互联网公司的招聘需求,基本都要求熟悉ES6标准,建议读者们都学习一下。

© 著作权归作者所有

共有 人打赏支持
前端二牛
粉丝 23
博文 86
码字总数 47062
作品 0
浦东
高级程序员
私信 提问
前端与编译原理——用 JS 写一个 JS 解释器

写于 2018.12.03 说起编译原理,印象往往只停留在本科时那些枯燥的课程和晦涩的概念。作为前端开发者,编译原理似乎离我们很远,对它的理解很可能仅仅局限于“抽象语法树(AST)”。但这仅仅...

Jrain
02/02
0
0
JS 底蕴之 变量、作用域和垃圾回收

基本类型和引用类型 在 JavaScript 中,数据类型可分为基本类型和引用类型, 基本类型有六种:Null,Undefined,String,Boolean,Number,Symbol; 而引用类型就是传说中的 Object 了。 其中...

Fly_001
2018/05/23
0
0
【译】理解JavaScript闭包——新手指南

闭包是JavaScript中一个基本的概念,每个JavaScript开发者都应该知道和理解的。然而,很多新手JavaScript开发者对这个概念还是很困惑的。 正确理解闭包可以帮助你写出更好、更高效、简洁的代...

LINJIAJUN
2018/11/28
0
0
翻译 - JavaScript中的作用域与变量声明提升

本文地址:http://blog.163.com/jinluhz/blog/static/113830152201131132035178/ 原文地址:http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting 原文作者:ben cherry ......

蜗牛奔跑
2015/06/19
0
0
深入ECMAScript系列(三):闭包

对词法环境和执行上下文不太了解的朋友,建议先阅读系列文章的前两篇,有助于理解本文,链接 -> 深入ECMAScript系列目录地址(持续更新中...) 一、词法作用域 首先我们来看一个例子(来自冴...

Logan70
2018/12/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微信退款异步通知解密异常->填充无效,无法被移除

该问题是怎么引起的? AESDecrypt 加密处理发生异常 重现步骤 使用模拟工具 POSTMan 发送模拟通知 示例报文一: <return_code>SUCCESS</return_code><mch_id></mch_id><nonce_str></nonce_st......

夏至如沫
22分钟前
1
0
PC端网页使用微信扫码获取用户精确地理位置的一种解决方案[未测试]

移动互联网时代,获取用户地理位置来实现LBS当然不再话下。 在传统的PC浏览器应用领域,想获取用户的位置信息一般采用第三方的IP库,比如:淘宝IP地址库。但这种解决方案的缺陷是显而易见的:...

dragon_tech
24分钟前
1
0
【机器学习PAI实战】—— 玩转人工智能之利用GAN自动生成二次元头像

前言 深度学习作为人工智能的重要手段,迎来了爆发,在NLP、CV、物联网、无人机等多个领域都发挥了非常重要的作用。最近几年,各种深度学习算法层出不穷, Generative Adverarial Network(GAN...

迷你芊宝宝
27分钟前
2
0
Dijkstra算法之 Java详解

迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为...

孟飞阳
30分钟前
1
0
php7.2安装zookeeper扩展

简单记录下安装过程。 一、安装libzookeeper cd /usr/local/src/wget http://mirror.bit.edu.cn/apache//zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gztar -xf zookeeper-3.4.5.ta......

叫我哀木涕
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部