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 相关文章推荐
js 关于=+与+=日期函数使用说明(赋值运算符)
Nov 15 Javascript
探讨js中的双感叹号判断
Nov 11 Javascript
javascript获取form里的表单元素的示例代码
Feb 14 Javascript
JavaScript自定义等待wait函数实例分析
Mar 23 Javascript
Javascript监视变量变化的方法
Jun 09 Javascript
如何使用AngularJs打造权限管理系统【简易型】
May 09 Javascript
AngularJS bootstrap启动详解及实例代码
Sep 14 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
Jan 14 Javascript
使用gulp搭建本地服务器并实现模拟ajax
Apr 05 Javascript
vue如何获取自定义元素属性参数值的方法
May 14 Javascript
解决Vue动态加载本地图片问题
Oct 09 Javascript
javascript全局自定义鼠标右键菜单
Dec 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
PHP集成FCK的函数代码
2008/09/27 PHP
PHP 创建标签云函数代码
2010/05/26 PHP
linux命令之调试工具strace的深入分析
2013/06/03 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
PHP获取路径和目录的方法总结【必看篇】
2017/03/04 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
jQuery解析json数据实例分析
2015/11/24 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
JS动态图片的实现方法完整示例
2020/01/13 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
[02:11]2016国际邀请赛中国区预选赛全程回顾
2016/07/01 DOTA
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
Python读写Excel文件方法介绍
2014/11/22 Python
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
Python学生信息管理系统修改版
2018/03/13 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
python获取栅格点和面值的实现
2020/03/10 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
HTML5和CSS3实例教程总结(推荐)
2016/07/18 HTML / CSS
总经理助理岗位职责
2013/11/08 职场文书
护理个人求职信范文
2014/01/08 职场文书
员工考核管理制度
2014/02/02 职场文书
员工手册编写范本
2015/05/14 职场文书
初中语文教师研修日志
2015/11/13 职场文书