👏作者简介:大家好,我是小童,Java开发工程师,Java领域新星创作者
📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人
函数的扩展_函数参数的默认值
基本用法
ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法
function log(info) {
info = info || 'World';
console.log(info);
}
log();
ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面
function log(info = 'world') {
console.log(info);
}
log();
除了简洁,ES6 的写法还有两个好处:首先,阅读代码的人,可以立刻意识到哪些参数是可以省略的
另外,一个容易忽略的地方是,参数默认值不是传值的,而是每次 都重新计算默认值表达式的值。也就是说,参数默认值是惰性求值的。
let x = 99;
function add(p = x + 1) {
console.log(p);
}
add() // 100
x = 100;
add() // 101
参数默认值的位置
function add(x = 1, y) {
console.log(x+y);
}
add(10) // NaN
函数的 length 属性
指定了默认值以后,函数的 length 属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后, length 属性将失真
function fn1(x){}
console.log(fn1.length); // 1
function fn2(x=1){}
console.log(fn2.length); // 0
应用
利用参数默认值,可以指定某一个参数不得省略,如果省略就抛出 一个错误
function missingParameter() {
throw new Error('Missing parameter');
}
function add(x = missingParameter()) {
console.log(x);
}
add() // Missing parameter
实时效果反馈
1. 下列代码运算结果是多少:
function fn1(x,y=10) { } console.log(fn1.length);
A 0
B 1
C 2
D 报错
函数的扩展_箭头函数
基本用法
ES6 允许使用“箭头”( => )定义函数
var add = (x) => x;
// 等同于
var add = function (x) {
return x;
};
如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分
var add = (x,y) => x+y;
// 等同于
var add = function (x,y) {
return x+y;
};
var add = () => 100;
// 等同于
var add = function () {
return 100;
};
如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用 return 语句返回
var add = (x,y) => {
var z = 10;
return x+y+z
};
// 等同于
var add = function (x,y) {
var z = 100
return x+y+z
};
由于大括号被解释为代码块,所以如果箭头函数直接返回一个对 象,必须在对象外面加上括号,否则会报错。
var add = (x,y) => ({x:10,y:20});
箭头函数的一个用处是简化回调函数
var arr = [10,20,30]
arr.map(item =>{
console.log(item);
})
使用注意点
箭头函数有几个使用注意点
1 箭头函数没有自己的 this 对象
2 不可以当作构造函数,也就是说,不可以对箭头函数使用 new 命令,否则会抛出一个错误 3 不可以使用 arguments 对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替 4 不可以使用 yield 命令,因此箭头函数不能用作 Generator 函数
最重要的是第一点。对于普通函数来说,内部的 this 指向函数运行时所在的对象,但是这一点对箭头函数不成立。它没有自己的 this 对 象,内部的 this 就是定义时上层作用域中的 this 。也就是说,箭头函数内部的 this 指向是固定的,相比之下,普通函数的 this 指向是可变的。
var name = "itxiaotong"
var user = {
name:"iwen",
getName(){
setTimeout(() =>{
console.log(this.name); // iwen
})
}
}
user.getName()
温馨提示
箭头函数里面根本没有自己的 this ,而是引用外层的 this
长期以来,JavaScript 语言的 this 对象一直是一个令人头痛的问题, 在对象方法中使用 this ,必须非常小心。箭头函数”绑定” this ,很大 程度上解决了这个困扰。
实时效果反馈
1. 下列代码运行结果是多少:
var name = "itxiaotong" var user = { name:"iwen", getName(){ setTimeout(() =>{ console.log(this.name); }) } } user.getName()
A itxiaotong
B iwen
C null
D 报错
函数的扩展_其他
rest 参数
ES6 引入 rest 参数(形式为 ...变量名 ),用于获取函数的多余参数, 这样就不需要使用 arguments
function add(...values) {
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
add(2, 5, 3) // 10
注意,rest 参数之后不能再有其他参数(即只能是最后一个参 数),否则会报错
function add(a, ...b,c) {} // 报错
函数的 length 属性,不包括 rest 参数
function add(a, ...b) {}
console.log(add.length); // 1
严格模式
从 ES5 开始,函数内部可以设定为严格模式
function doSomething(a, b) {
'use strict';
// code
}
ES2016 做了一点修改,规定只要函数参数使用了默认值、解构赋值、或者扩展运算符,那么函数内部就不能显式设定为严格模式, 否则会报错。
// 报错
function doSomething(a, b = a) {
'use strict';
// code
}
name 属性
函数的 name 属性,返回该函数的函数名
function foo() {}
foo.name // "foo"
这个属性早就被浏览器广泛支持,但是直到 ES6,才将其写入了标准
实时效果反馈
1. 下列代码运行结果是多少:
function add(a,b, ...c) {} console.log(add.length);
A 0
B 1
C 2
D 3