es6函数中的作用域实例分析


Posted in Javascript onApril 18, 2020

本文实例讲述了es6函数中的作用域。分享给大家供大家参考,具体如下:

一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值,是不会出现的。

var x = 1;

function f(x, y = x) {
 console.log(y);
}

f(2) // 2

上面的代码中,参数y的默认值等于变量x。调用函数f时,参数形成一个单独的作用域。在这个作用域里面,默认值变量x指向第一个参数x,而不是全局变量x,所以输出是2。

再看下面的例子。

let x = 1;

function f(y = x) {
 let x = 2; 
 console.log(y)
}

上面代码中,函数f调用时,参数y = x形成一个单独的作用域,这个作用域里面,变量x本身没有定义,所以指向外层的全局变量x。函数调用时,函数体内部的局部变量x影响不到默认值变量x。

如果此时,全局变量x不存在,就会报错。

function f(y = x) {
 let x = 2;
 console.log(y)
}

f() // ReferenceError: x is not defined

下面这样写,也会报错。

var x = 1;

function foo(x = x) {
 // ...
}

foo() // ReferenceError: x is not defined

上面代码中,参数x = x形成一个单独作用域,实际执行的是 let x = x,由于暂时性死区的原因,这行代码会报错"x未定义"。

如果参数的默认值是一个函数,该函数的作用域也遵守这个规则。请看下面的例子。

let foo = 'outer'

function bar(func = () => foo) {
 let foo = 'inner';
 console.log(func())
}

bar() // outer

上面代码中,函数bar的参数func的默认值是一个匿名函数,返回值是变量foo。函数参数形成的单独的作用域里面,并没有定义变量foo,所以foo指向外层的全局变量foo,因此输出outer。

如果写成下面这样,就会报错。

function bar (func = () => foo) {
 let foo = 'inner'
 console.log(func())
}

bar() // ReferenceError: foo is not defined

上面代码中,匿名函数里面的foo指向函数外层,但是函数外层并没有声明变量foo,所以报错了。

下面是一个更复杂的例子。

var x = 1;
function foo(x, y = function() {x = 2;}) {
 var x = 3;
 y()
 console.log(x)
}

foo() // 3
x // 1

上面代码中,函数foo的参数形成一个单独作用域。这个作用域里面,首先声明了变量x,然后声明了变量y,y的默认值是一个匿名函数。这个匿名函数内部的变量x, 指向同一个作用域的第一个参数x。函数foo内部又声明了一个内部变量。该变量与第一个参数x由于不是同一个作用域,所以不是同一个变量,因此执行y后,内部变量x和外部全局变量x的值都没变。

如果将var x = 3的var 去除,函数foo的内部变量x就指向第一个参数,与匿名函数内部的x是一致的,所以最后输出的就是2,而外层的全局变量x依然不受影响。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
静态页面的值传递(三部曲)
Sep 25 Javascript
jquery 回车事件实现代码
Aug 23 Javascript
CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法
Mar 29 Javascript
js导出txt示例代码
Jan 14 Javascript
jquery中常用的函数和属性详细解析
Mar 07 Javascript
JavaScript中的console.trace()函数介绍
Dec 29 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
Aug 14 Javascript
JS实现DIV高度自适应窗口示例
Feb 16 Javascript
jquery实现图片轮播器
May 23 jQuery
解决Vue+Electron下Vuex的Dispatch没有效果问题
May 20 Javascript
js实现带箭头的进度流程
Mar 26 Javascript
javascript 设计模式之组合模式原理与应用详解
Apr 08 Javascript
es6函数之rest参数用法实例分析
Apr 18 #Javascript
vue实现短信验证码输入框
Apr 17 #Javascript
JS监听组合按键思路及实现过程
Apr 17 #Javascript
javascript canvas检测小球碰撞
Apr 17 #Javascript
Vue实现浏览器打印功能的代码
Apr 17 #Javascript
基于JavaScript获取url参数2种方法
Apr 17 #Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
Apr 17 #Javascript
You might like
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
laravel-admin select框默认选中的方法
2019/10/03 PHP
如何运行/调试你的PHP代码
2020/10/23 PHP
用js实现上传图片前的预览(TX的面试题)
2007/08/14 Javascript
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
js优化针对IE6.0起作用(详细整理)
2012/12/25 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
2013/08/21 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
2016/03/10 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
如何开发出更好的JavaScript模块
2017/12/22 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
vue中英文切换实例代码
2020/01/21 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
理解生产者消费者模型及在Python编程中的运用实例
2016/06/26 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
Django rest framework实现分页的示例
2018/05/24 Python
python递归全排列实现方法
2018/08/18 Python
PyCharm的设置方法和第一个Python程序的建立
2019/01/16 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
2019/08/08 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
serialVersionUID具有什么样的特征
2014/02/20 面试题
简历的自我评价范文
2014/02/04 职场文书
学校门卫岗位职责
2014/03/16 职场文书
教师节活动主持词
2014/04/02 职场文书
优秀应届本科生求职信
2014/07/19 职场文书
三八妇女节趣味活动方案
2014/08/23 职场文书
服务员态度差检讨书
2014/10/28 职场文书
感谢信的技巧及范例
2019/05/15 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python
python神经网络ResNet50模型
2022/05/06 Python