"Code tailor",为前端开发者提供技术相关资讯以及系列基础文章,微信关注“小和山的菜鸟们”公众号,及时获取最新文章。
在开始学习以前,咱们想要告诉您的是,本文章是对阮一峰《ECMAScript6 入门》一书中 "函数的扩展" 章节的总结,若是您已掌握下面知识事项,则可跳过此环节直接进入题目练习javascript
若是您对某些部分有些遗忘,👇🏻 已经为您准备好了!前端
函数的扩展学习java
为函数的参数指定默认值
// ES5写法 function log(x, y) { y = y || 'World' console.log(x, y) } log('Hello') // Hello World // ES6写法 function log(x, y = 'World') { console.log(x, y) } log('Hello') // Hello World
优势:es6
注意:数组
let
或 const
再次声明function foo(x = 5) { let x = 1 // error const x = 2 // error }
// 不报错 function foo(x, x, y) { // ... } // 报错 function foo(x, x, y = 1) { // ... }
let x = 99 function foo(p = x + 1) { console.log(p) } foo() // 100 x = 100 foo() // 101
一旦设置了参数的默认值,函数进行声明初始化时,参数会造成一个单独的做用域(context)。等到初始化结束,这个做用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。
var x = 1 function foo( x, y = function () { x = 2 }, ) { var x = 3 y() console.log(x) } foo() // 3 x // 1 // 分割线 var x = 1 function foo( x, y = function () { x = 2 }, ) { x = 3 y() console.log(x) } foo() // 2 x // 1
ES6 引入rest
参数(形式为...变量名),用于获取函数的多余参数,这样就不须要使用arguments
对象了。rest
参数搭配的变量是一个数组,该变量将多余的参数放入数组中。
function add(...values) { let sum = 0 for (var val of values) { sum += val } return sum } add(2, 5, 3) // 10 //上面代码的add函数是一个求和函数,利用 rest 参数,能够向该函数 //传入任意数目的参数。
注意,
rest
参数以后不能再有其余参数(即只能是最后一个参数),不然会报错。
ES6 容许使用“箭头”(
=>
)定义函数。
var f = (v) => v // 等同于 var f = function (v) { return v }
若是箭头函数不须要参数或须要多个参数,就使用一个圆括号表明参数部分。微信
var f = () => 5 // 等同于 var f = function () { return 5 } var sum = (num1, num2) => num1 + num2 // 等同于 var sum = function (num1, num2) { return num1 + num2 }
若是箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,而且使用 return
语句返回。函数
var sum = (num1, num2) => { return num1 + num2 }
箭头函数有几个使用注意点:学习
this
对象,就是定义时所在的对象,而不是使用时所在的对象。new
命令,不然会抛出一个错误。arguments
对象,该对象在函数体内不存在。若是要用,能够用 rest
参数代替。yield
命令,所以箭头函数不能用做 Generator
函数。上面四点中,第一点尤为值得注意。this
对象的指向是可变的,可是在箭头函数中,它是固定的。优化
一:如下代码输出什么this
var x = 1 function foo(x, y = () => (x = 5)) { x = 9 y() console.log(x) } foo()
二:如下代码输出什么
const shape = { radius: 10, diameter() { return this.radius * 2 }, perimeter: () => 2 * Math.PI * this.radius, } shape.diameter() shape.perimeter()
20
and 62.83185307179586
20
and NaN
20
and 63
NaN
and 63
三:解释下述代码(含义、运行结果以及做用)。
f1 = (x) => (y) => (z) => x * y * z
1、
Answer:5
首先须要看明白函数foo
,function foo(x, y = () => x = 5)
,重点在于第二个y = () => x = 5
,意思为须要给与foo
函数一个函数,若是没有,那么 y 表明的就是
;() => { x = 5 }
这一个函数,这里调用 foo
,并无给与第二个函数,那么执行的时候,y()
实际上就是将 x
赋值为 5
,所以打印出来为 5
。
2、
Answer:B
首先须要了解,在箭头函数中,this
的指向和在普通函数中不一样,箭头函数中this
指向在定义的时候就肯定好了。在diameter
函数中,经过this.radius
访问的就是shape
中的radius
,为 10
。
可是,在perimeter
函数中,后面经过this.radius
访问的radius
并非shape
中的radius
,在外层寻找找不到,所以返回NaN
。所以答案为20 and NaN
3、
首先,这样子使用箭头函数逻辑不是很清楚,将其转换为普通函数:
function f1(x) { return function f2(y) { return function f3(z) { return x * y * z } } }
含义:将三个数相乘
运行结果:f1(x)(y)(z)===x*y*z
最外层,f1
是一个带一个形参的函数,返回值是一个带一个形参的函数 f2,f1(x)(y)(z)->f2(y)(z),f2
返回值是一个带一个形参的函数 f3,f2(y)(z)->f3(z)
,由于返回的函数是在 f1
和 f2
中定义的,根据做用域链,能够取到 x
和 y
的值,因此f3
的返回值为x*y*z
,最后 f1(x)(y)(z)===x*y*z
ES 6 系列的 函数的扩展,咱们到这里结束啦,谢谢各位对做者的支持!大家的关注和点赞,将会是咱们前进的最强动力!谢谢你们!