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 18 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
May 09 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
May 24 Javascript
jQuery取得设置清空select选择的文本与值
Jul 08 Javascript
jQuery表单美化插件jqTransform使用详解
Apr 12 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
Dec 02 Javascript
Angular实现下载安装包的功能代码分享
Sep 05 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
Sep 28 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
Nov 02 Javascript
微信小程序调用微信支付接口的实现方法
Apr 29 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
May 17 jQuery
webpack是如何实现模块化加载的方法
Nov 06 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中的array数组类型分析说明
2010/07/27 PHP
php实现简单洗牌算法
2013/06/18 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
Prototype ObjectRange对象学习
2009/07/19 Javascript
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
jQuery ready()和onload的加载耗时分析
2016/09/08 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
Vue+webpack+Element 兼容问题总结(小结)
2018/08/16 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
express异步函数异常捕获示例详解
2020/11/30 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
Python打印斐波拉契数列实例
2015/07/07 Python
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
Django视图和URL配置详解
2018/01/31 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
2021/02/23 Python
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
英国打印机墨水和碳粉商店:Printerinks
2017/06/30 全球购物
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
英语国培研修感言
2014/02/13 职场文书
中文教师求职信
2014/02/22 职场文书
安全生产管理合理化建议书
2014/03/12 职场文书
地球一小时倡议书
2014/04/15 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL
MYSQL如何查看进程和kill进程
2022/03/13 MySQL