ES6规范前后块级作用域与函数声明的缠缠绵绵
今天我们就以上面的这个例子来说一下,块级作用域与函数声明在ES6前后的纠葛,当然在ES6之前是没有块级作用域的,但为了与ES6统一,使文章更简明,所以把这对‘{}’统一称为块级作用域。
开正题之前,还是要说一下,因为块级作用域与函数声明之间的这种变化,所以应该尽量避免使用。若需要,可以使用函数表达式代替。
一、ES6之前由于函数声明会提升至全局作用域或函数作用域顶部,所以上面的代码无法达到编程人员的预期效果,因为前面的函数声明会被后面的覆盖,所以调用f(),始终打印数字2;(这里还是要啰嗦一下,为了文章简洁,我简单的把语法规范划为了两部分,但在ES5规范中是不允许在“块级作用域”中进行函数的声明的,可是若浏览器遵循此规范,会影响大批旧代码,所以浏览器厂商并未遵循此规范)。
二、ES6之后,规范中规定可以在块级作用域中进行函数声明,并且不会在作用域外访问到,此规范下编写上面的代码,完全符合编程人员的需求,但最大的问题还是向后兼容。所以在ES6规范的附录中规定,浏览器可以不遵守规范,有自己的行为。
三、现如今浏览器对块级作用域与函数声明之间的行为,也就是ES6附录中的规范:
1、允许在块级作用域内声明函数
2、函数声明类似于var,即会提升至全局作用域或函数作用域的头部
3、函数声明还会提升到所在块级作用域的头部
我们结合例子来解读一下上面的三条规范,函数f会只将函数名提升至全局作用域,不会提升函数体。这样若在判断语句之前调用f();会出现“f is not a function”的错误。
类似于var,只会提升定义,并不会提升赋值。
至于第三句规范,也就是说在块级作用域内函数还是按照ES6之前那样,函数声明与函数体一块提升。
这样的行为,也让上面的代码实现了编程人员的本来想法。
综合来说,就是说ES6之前,函数全部提升;ES6之后,浏览器环境内函数提升一半,但其他环境还是按照ES6的本意实现真正的块级作用域。
ES6规范前后块级作用域与函数声明的缠缠绵绵相关推荐
- 搭建Babel运行环境,Traceur ES6模板,块级作用域,let和const命令
搭建Babel运行环境 Babel(http://babeljs.io/)可用于将使用ES6语法的脚本转化为ES5语法的脚本,基本功能的安装步骤如下: 1.安装node解释器和npm包管理工具 2.安 ...
- 块级作用域和函数作用域
函数作用域与块级作用域 函数作用域:在函数内部声明的变量只能影响到变量所在函数体本身,无法从外部对函数内部的变量进行调用,被称为'函数作用域' 块级作用域:ES6 引入了 let 和 const 关键 ...
- 《深入理解ES6》笔记——块级作用域绑定(1)
本章涉及3个知识点,var.let.const,现在让我们了解3个关键字的特性和使用方法. var JavaScript中,我们通常说的作用域是函数作用域,使用var声明的变量,无论是在代码的哪个地方 ...
- es6中的块级作用域
块级作用域 凡是带{}都是块级作用域,if(){} for(){} 对象{} 1.在块级作用域下,var 和function跟在window下一样, function有个特殊的一点,在块级作用域下会提 ...
- es6 ie不兼容 函数_ES6:什么是块级作用域?
在 ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景. 我们先来看一下下面这种情况:内层变量可能会覆盖外层变量. var txt = '外层变量-->你好呀';func ...
- ES6 块级作用域详解
什么是块级作用域 ES6 中新增了块级作用域.块作用域由 { } 包括,if 语句和 for 语句里面的 { } 也属于块作用域. 为什么需要块级作用域 第一种场景:内部变量会覆盖外部变量 var t ...
- java区块作用域_ES6-let、const和块级作用域
1.介绍 总的来说,ES6是在ES2015的基础上改变了一些书写方式,开放了更多API,这样做的目的最终还是为了贴合实际开发的需要.如果说一门编程语言的诞生是天才的构思和实现,那它的发展无疑就是不断填 ...
- ES6基础2(块级作用域、数组对象解构)-学习笔记
文章目录 ES6基础2(块级作用域.数组对象解构)-学习笔记 块级作用域 数组解构 对象解构 字符串解构 函数的参数解构 ES6基础2(块级作用域.数组对象解构)-学习笔记 块级作用域 //let c ...
- 学习笔记=《你不知道的JavaScript(上卷)》第三章:函数作用域和块级作用域...
3.1 函数中的作用域 (1)JavaScript具有基于函数的作用域,每声明一个函数的时候会为其自身创建一个'气泡',这个气泡内声明的变量或函数外界无法访问. 函数作用域的含义是指,属于这个函数的全 ...
最新文章
- xp系统安装oracle乱码,linux中安装Oracle汉字乱码完整解决方案
- 【直播回顾】云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第19讲):Java Spring Cloud微服务架构模式与开发实战...
- NSURLConnection实现文件上传和AFNetworking实现文件上传
- 相关系数excel_跟着思想学外汇-如何用Excel计算货币相关性
- Django中使用和配置Redis数据库
- axure原型怎么让文字自动换行_理解「回车」和「换行」,纠正数据输入过程中的坏习惯...
- c# 批量mqtt_C#使用 MQTTnet 快速实现 MQTT 通信(文末有完整Demo下载)
- spring中需要掌握的25个常用注解
- evt参数是干啥用的_塑料凳子上的洞,是干啥用的?
- tcp和udp的优缺点
- Python之数据分析(间接联合排序、所有最值相关函数、有序插入、定积分、插值器对象)
- Integer转BigDecimal
- 赣榆高中2021高考成绩查询,2020年连云港赣榆高考续写辉煌,各大高中“喜报”新鲜出炉...
- 如何实现一个遵从设计原则的积分兑换系统2
- Python爬取网易云歌词并生成词云
- Java Eclipse部分图标汇总
- 金蝶账套总显示找不到服务器,金蝶KIS账套名称登录时没有显示怎么办呢
- Codeforces 1194B+1194D
- 基于stm32单片机的物联网WiFi智能快递柜设计
- ng-template、ng-content、ng-container