ES6——函数参数默认值
ES6 之前,不能直接为函数的参数指定默认值,ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。
function fun(x = 'Hello'){console.log(x);
}
fun(); //Hello
fun('Hi') //Hi
参数变量是默认声明的,所以不能用let
或const
再次声明。
function fun(x = 0){let x = 1; //报错const x = 1; //报错
}
使用参数默认值时,函数不能有同名参数。
//不报错
function fun1(x , x , y){...
}//报错
function fun2(x , x , y = 0){...
}
参数默认值可以与解构赋值的默认值,结合起来使用。
function fun({x = 0 , y}){console.log(x , y);
}
fun({}); //0,undefined
fun({y: 1}); //0,1
fun({x: 2, y: 1}); //2,1
fun(); //报错
上面代码只使用了对象的解构赋值默认值,没有使用函数参数的默认值。只有当函数foo
的参数是一个对象时,变量x
和y
才会通过解构赋值生成。如果函数foo
调用时没提供参数,变量x
和y
就不会生成,从而报错。通过提供函数参数的默认值,就可以避免这种情况。
function fun({x = 0 , y} = {}){console.log(x , y);
}
fun(); //0,undefined
通常情况下,定义了默认值的参数,应该是函数的尾参数。因为这样比较容易看出来,到底省略了哪些参数。如果非尾部的参数设置默认值,实际上这个参数是没法省略的。
// 例一
function f(x = 1, y) {return [x, y];
}f() // [1, undefined]
f(2) // [2, undefined]
f(, 1) // 报错
f(undefined, 1) // [1, 1]
上面代码中,有默认值的参数都不是尾参数。这时,无法只省略该参数,而不省略它后面的参数,除非显式输入undefined
。
如果传入undefined
,将触发该参数等于默认值,null
则没有这个效果。
指定了默认值以后,函数的length
属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length
属性将失真。
(function (a) {}).length // 1
(function (a = 5) {}).length // 0
(function (a, b, c = 5) {}).length // 2
这是因为length
属性的含义是,该函数预期传入的参数个数。某个参数指定默认值以后,预期传入的参数个数就不包括这个参数了。同理,后文的 rest
参数也不会计入length
属性。
(function(...args) {}).length // 0
如果设置了默认值的参数不是尾参数,那么length
属性也不再计入后面的参数了。
(function (a = 0, b, c) {}).length // 0
(function (a, b = 1, c) {}).length // 1
一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(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(); // 1
上面代码中,函数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
ES6——函数参数默认值相关推荐
- ES6-ES11-第一部分-let、const、解构赋值、模板字符串、简化对象写法、箭头函数、函数参数默认值、rest 参数、扩展运算符、Symbol、迭代器、生成器、Promise、Set、Map
根据视频进行整理 [https://www.bilibili.com/video/BV1uK411H7on?p=1] 视频资源(百度网盘): 链接:[https://pan.baidu.com/s/1 ...
- C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)
每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...
- C++之函数参数默认值
C++之函数参数默认值 1.参数默认值的指定方式 在 C++ 中,可以在函数声明时为参数提供一个默认值.这样在函数调用时,如果没有提供函数参数值,则使用默认值. e.g. 在函数声明时,指定参数默认值 ...
- c++函数参数默认值设置
c++函数参数默认值设置 1,函数参数默认值在函数声明的参数列表上定义,函数定义不变: #include <iostream>using namespace std; int add(in ...
- ES6新特性之函数优化-参数默认值
函数优化 在ES6中,对函数的操作做了优化,使得我们在操作函数时更加的便捷. 函数参数默认值 在ES6以前,我们无法给一个函数参数设置默认值,只能采用变通写法: function add(a , b) ...
- JavaScript中实现函数重载和参数默认值
2019独角兽企业重金招聘Python工程师标准>>> 参数默认值是指在调用函数时,若省略了某个实参,函数会自动为该参数分配一个默认值,使得函数调用的方便性和灵活性大大提高. 举个例 ...
- php函数的默认值,php函数指定默认值方法的小例子
php函数指定默认值方法的小例子 本节内容: php函数指定默认值 在php编程中,为自定义函数设定默认值,当用户调用该函数时,如果不给参数指定值,参数会用默认值顶替. 例1, 复制代码 代码如下: ...
- ES6函数参数的默认值
基本用法 在ES6之前,不能直接将函数的参数指定默认值,只能采用变通的方法 function fn(x,y) {y = y || 'World'console.log(x,y) }fn('Hello' ...
- ES6函数参数的解构赋值,以及2种设置参数默认值方法的区别
文章目录 1. 函数参数的解构赋值方式 2. 函数参数解构设置参数默认值 1. 方法1 2. 方法2 3. 总结 1. 函数参数的解构赋值方式 下面代码中,函数add的参数表面上是一个数组,但在传入参 ...
最新文章
- python更改使用国内镜像源安装、更新模块
- iOS 获取键盘相关信息
- ASP.NET Excel导入到SQL Server数据库
- 从零开始入门 K8s| K8s 的应用编排与管理
- java生成数据插入hbase_hbase实战之javaAPI插入数据
- 中怎样载入选区_ps中快捷大全
- 网站服务器时间秒杀,Javascript实现商品秒杀倒计时(时间与服务器时间同步)...
- gps卫星位置计算程序matlab_科研项目 | BD/ GPS卫星导航仿真测试系统研究
- Scrapy 爬虫框架初体验二 —— 以一个新闻站点爬取为例
- CC攻击(N个免费代理形成的DDOS)
- Python爬虫(二十一)_Selenium与PhantomJS
- 使用.NET 5自动查找代码中的潜在错误
- lambdapython语法_Python中lambda表达式的语法与应用
- JMP软件在六西格玛项目管理中高阶应用(五)
- webofscience入口注册_Web Of Science数据库免费检索入口,SCI论文期刊数据库免费入口...
- EDGE网络已落户嘉兴
- vue用html方式路由守卫,vue-router 实现导航守卫(路由卫士)的实例代码
- 标注 画框 转写,亲亲,你做错了没?
- 此mac已与apple id关联(如何绕过macOS恢复模式的激活锁)
- LC滤波器的截止频率公式