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 读取页面load get post ajax 四种方式代码写法
Apr 02 Javascript
js中的json对象详细介绍
Oct 29 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
Mar 26 Javascript
JavaScript脚本判断蜘蛛来源的方法
Sep 22 Javascript
使用JS中的exec()方法构造正则表达式验证
Aug 01 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
Oct 14 Javascript
javascript实现滑动解锁功能
Mar 22 Javascript
详解JSONObject和JSONArray区别及基本用法
Oct 25 Javascript
Vue多种方法实现表头和首列固定的示例代码
Feb 02 Javascript
Element-UI踩坑之Pagination组件的使用
Oct 29 Javascript
vue路由插件之vue-route
Jun 13 Javascript
js实现头像上传并且可预览提交
Dec 25 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生成N个不重复的随机数实例
2013/11/12 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
2014/11/19 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
分享别人写的一个小型js框架
2007/08/13 Javascript
jQuery中filter(),not(),split()使用方法
2010/07/06 Javascript
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
利用js动态添加删除table行的示例代码
2013/12/16 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
ES6关于Promise的用法详解
2018/05/07 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
用python建立两个Y轴的XY曲线图方法
2019/07/08 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
2019/09/23 Python
python dict乱码如何解决
2020/06/07 Python
天猫国际进口超市直营:官方直采,一站购齐
2017/12/11 全球购物
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
德尔福集团DELPHI的笔试题
2012/02/22 面试题
电子商务专员岗位职责
2013/12/11 职场文书
高级护理专业毕业生推荐信
2013/12/25 职场文书
优秀村官事迹材料
2014/01/10 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
民事起诉书范本
2015/05/19 职场文书
2016年学校党支部公开承诺书
2016/03/25 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis