今天我们就以上面的这个例子来说一下,块级作用域与函数声明在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规范前后块级作用域与函数声明的缠缠绵绵相关推荐

  1. 搭建Babel运行环境,Traceur ES6模板,块级作用域,let和const命令

    搭建Babel运行环境 Babel(http://babeljs.io/)可用于将使用ES6语法的脚本转化为ES5语法的脚本,基本功能的安装步骤如下: 1.安装node解释器和npm包管理工具 2.安 ...

  2. 块级作用域和函数作用域

    函数作用域与块级作用域 函数作用域:在函数内部声明的变量只能影响到变量所在函数体本身,无法从外部对函数内部的变量进行调用,被称为'函数作用域' 块级作用域:ES6 引入了 let 和 const 关键 ...

  3. 《深入理解ES6》笔记——块级作用域绑定(1)

    本章涉及3个知识点,var.let.const,现在让我们了解3个关键字的特性和使用方法. var JavaScript中,我们通常说的作用域是函数作用域,使用var声明的变量,无论是在代码的哪个地方 ...

  4. es6中的块级作用域

    块级作用域 凡是带{}都是块级作用域,if(){} for(){} 对象{} 1.在块级作用域下,var 和function跟在window下一样, function有个特殊的一点,在块级作用域下会提 ...

  5. es6 ie不兼容 函数_ES6:什么是块级作用域?

    在 ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景. 我们先来看一下下面这种情况:内层变量可能会覆盖外层变量. var txt = '外层变量-->你好呀';func ...

  6. ES6 块级作用域详解

    什么是块级作用域 ES6 中新增了块级作用域.块作用域由 { } 包括,if 语句和 for 语句里面的 { } 也属于块作用域. 为什么需要块级作用域 第一种场景:内部变量会覆盖外部变量 var t ...

  7. java区块作用域_ES6-let、const和块级作用域

    1.介绍 总的来说,ES6是在ES2015的基础上改变了一些书写方式,开放了更多API,这样做的目的最终还是为了贴合实际开发的需要.如果说一门编程语言的诞生是天才的构思和实现,那它的发展无疑就是不断填 ...

  8. ES6基础2(块级作用域、数组对象解构)-学习笔记

    文章目录 ES6基础2(块级作用域.数组对象解构)-学习笔记 块级作用域 数组解构 对象解构 字符串解构 函数的参数解构 ES6基础2(块级作用域.数组对象解构)-学习笔记 块级作用域 //let c ...

  9. 学习笔记=《你不知道的JavaScript(上卷)》第三章:函数作用域和块级作用域...

    3.1 函数中的作用域 (1)JavaScript具有基于函数的作用域,每声明一个函数的时候会为其自身创建一个'气泡',这个气泡内声明的变量或函数外界无法访问. 函数作用域的含义是指,属于这个函数的全 ...

最新文章

  1. xp系统安装oracle乱码,linux中安装Oracle汉字乱码完整解决方案
  2. 【直播回顾】云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第19讲):Java Spring Cloud微服务架构模式与开发实战...
  3. NSURLConnection实现文件上传和AFNetworking实现文件上传
  4. 相关系数excel_跟着思想学外汇-如何用Excel计算货币相关性
  5. Django中使用和配置Redis数据库
  6. axure原型怎么让文字自动换行_理解「回车」和「换行」,纠正数据输入过程中的坏习惯...
  7. c# 批量mqtt_C#使用 MQTTnet 快速实现 MQTT 通信(文末有完整Demo下载)
  8. spring中需要掌握的25个常用注解
  9. evt参数是干啥用的_塑料凳子上的洞,是干啥用的?
  10. tcp和udp的优缺点
  11. Python之数据分析(间接联合排序、所有最值相关函数、有序插入、定积分、插值器对象)
  12. Integer转BigDecimal
  13. 赣榆高中2021高考成绩查询,2020年连云港赣榆高考续写辉煌,各大高中“喜报”新鲜出炉...
  14. 如何实现一个遵从设计原则的积分兑换系统2
  15. Python爬取网易云歌词并生成词云
  16. Java Eclipse部分图标汇总
  17. 金蝶账套总显示找不到服务器,金蝶KIS账套名称登录时没有显示怎么办呢
  18. Codeforces 1194B+1194D
  19. 基于stm32单片机的物联网WiFi智能快递柜设计
  20. ng-template、ng-content、ng-container

热门文章

  1. android imagebutton 带文字图片的实现方法
  2. 完整的微信小程序支付开发记录(亲测)
  3. 苹果证书的申请、unityoc交互基础
  4. 例题总结——算24点
  5. gin+grom+jwt+mysql
  6. GetPrivateProfileString 中文乱码解决
  7. 【C#】大话设计模式- 13 建造者模式
  8. 三相电故障,两相间无380v电压
  9. 世界上最难征服的山峰排行
  10. 3dMax利用粒子流创建烟花效果详细教程