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 相关文章推荐
jQuery使用一个按钮控制图片的伸缩实现思路
Apr 19 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
May 27 Javascript
关于jquery中全局函数each使用介绍
Dec 10 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
Apr 12 Javascript
javascript学习笔记之10个原生技巧
May 21 Javascript
Bootstrap导航中表单简单实现代码
Mar 06 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
Apr 26 Javascript
老生常谈JavaScript面向对象基础与this指向问题
Oct 16 Javascript
Vue精简版风格指南(推荐)
Jan 30 Javascript
angular第三方包开发整理(小结)
Apr 19 Javascript
Node.js Stream ondata触发时机与顺序的探索
Mar 08 Javascript
基于JavaScript实现大文件上传后端代码实例
Aug 18 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多线程抓取网页实现代码
2010/07/22 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
php简单检测404页面的方法示例
2019/08/23 PHP
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
2013/09/05 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
2014/11/08 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
2015/08/11 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
JavaScript中的call和apply的用途以及区别
2017/01/11 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
基于wordpress的ajax写法详解
2018/01/02 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
手把手教你实现 Promise的使用方法
2020/09/02 Javascript
vue切换菜单取消未完成接口请求的案例
2020/11/13 Javascript
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
详解Python模块化编程与装饰器
2021/01/16 Python
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
大学生简历的个人自我评价
2013/12/04 职场文书
审计工作个人的自我评价
2013/12/25 职场文书
优秀演讲稿范文
2013/12/29 职场文书
解除劳动合同证明书
2014/09/26 职场文书
大专毕业生自我鉴定范文(2篇)
2014/09/27 职场文书
公司离职证明标准格式
2014/11/18 职场文书
研究生简历自我评
2015/03/11 职场文书
单独二胎证明
2015/06/24 职场文书
Java并发编程之原子性-Atomic的使用
2022/03/16 Java/Android