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,超强推荐base.js
Dec 23 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
Aug 21 Javascript
Angularjs 基础入门
Dec 26 Javascript
js实现显示当前状态的导航效果代码
Aug 28 Javascript
学习Angularjs分页指令
Jul 01 Javascript
十大热门的JavaScript框架和库
Mar 21 Javascript
理解Angular的providers给Http添加默认headers
Jul 04 Javascript
Javascript中的getter和setter初识
Aug 17 Javascript
原生JS与jQuery编写简单选项卡
Oct 30 jQuery
AnglarJs中的上拉加载实现代码
Feb 08 Javascript
JavaScript实现shuffle数组洗牌操作示例
Jan 03 Javascript
小程序选项卡以及swiper套用(跨页面)
Jun 19 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
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
2014/06/27 PHP
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
javascript下arguments,caller,callee,call,apply示例及理解
2009/12/24 Javascript
JavaScript的单例模式 (singleton in Javascript)
2010/06/11 Javascript
解析JavaScript中instanceof对于不同的构造器或许都返回true
2013/12/03 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
Angular 项目实现国际化的方法
2018/01/08 Javascript
Vue组件库发布到npm详解
2018/02/17 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
Node.JS用纯JavaScript生成图片或滑块式验证码功能
2019/09/12 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python引用DLL文件的方法
2015/05/11 Python
用python处理MS Word的实例讲解
2018/05/08 Python
Python爬虫实现(伪)球迷速成
2018/06/10 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
2018/12/24 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
Python Flask框架扩展操作示例
2019/05/03 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
Haggar官网:美国男装品牌
2020/02/16 全球购物
运动会闭幕式解说词
2014/02/21 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
2014年班主任德育工作总结
2014/12/05 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书