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 常用操作代码
Mar 14 Javascript
js关闭当前页面(窗口)的几种方式总结
Mar 05 Javascript
Textarea根据内容自适应高度
Oct 28 Javascript
JavaScript实现的in_array函数
Aug 27 Javascript
javascript实现链接单选效果的方法
May 13 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
May 03 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
Aug 07 Javascript
vue2.0 下拉框默认标题设置方法
Aug 22 Javascript
js设置鼠标悬停改变背景色实现详解
Jun 26 Javascript
js通过循环多张图片实现动画效果
Dec 19 Javascript
vue2和vue3的v-if与v-for优先级对比学习
Oct 10 Javascript
nuxt引入组件和公共样式的操作
Nov 05 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 smarty的预保留变量总结
2008/12/04 PHP
ecshop实现smtp发送邮件
2015/02/03 PHP
php保存任意网络图片到服务器的方法
2015/04/14 PHP
PHP加密技术的简单实现
2016/09/04 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
Firefox中autocomplete="off" 设置不起作用Bug的解决方法
2011/03/25 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
bootstrap jquery dataTable 异步ajax刷新表格数据的实现方法
2017/02/10 Javascript
基于JavaScript实现的顺序查找算法示例
2017/04/14 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
JavaScript中递归实现的方法及其区别
2017/09/12 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
JavaScript设计模式之调停者模式实例详解
2018/02/03 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
Python实现115网盘自动下载的方法
2014/09/30 Python
Python文件监听工具pyinotify与watchdog实例
2018/10/15 Python
python asyncio 协程库的使用
2021/01/21 Python
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
理想演讲稿范文
2014/05/21 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
2014年房产销售工作总结
2014/12/08 职场文书
老公保证书
2015/01/17 职场文书
党支部书记岗位职责
2015/02/15 职场文书
学习雷锋精神倡议书
2015/04/27 职场文书
2015年初中教师个人工作总结
2015/07/21 职场文书