// 函数参数
// 例:写一个求和函数,不管用户传入几个实参,都要把和求出来
// 动态参数:arguments 是函数内部内置的伪数组变量,它包含了调用函数时传入的所有实参
// function getSum() {
// let s = 0
// for (let i = 0; i < arguments.length; i++) {
// s += arguments[i]
// }
// console.log(s)
// }
// getSum(1, 2, 4, 5, 6, 7)
// 剩余参数:开发中提倡使用这种
// 语法:...
// function getSum(a, b, ...arr) {
// console.log(a + b)
// console.log(arr) 剩余参数是一个真数组,arr的位置任意单词都行,看你自己的需求
// }
// getSum(1, 2, 3, 4, 5)
// 展开运算符,哪里都可以用
// 语法:(...arr)
// const arr = [1, 2, 3, 4, 5]
// console.log(...arr)
// 典型运用场景:求数组(最大值)、合并数组等
// const arr = [1, 2, 3, 4, 5]
// console.log(Math.max(...arr))
// const arr1 = [1, 2, 3], arr2 = [4, 5]
// const arr = [...arr1, ...arr2]
// console.log(arr)
// 箭头函数:更简短的函数写法并且不绑定this,箭头函数的语法比函数表达式更简洁。箭头函数更适用于那些本来需要匿名函数的地方!!
// const fn = (x = 0) => { //只有一个形参的时候可以省略(),只有一行代码的时候可以省略{ }且不需要return返回值
// console.log(x)
// }
// fn(1)
// 简化后:
// const fn = x => console.log(x) //但是形参需要默认值的话就还是要加括号
// fn(1)
// const fn = (x = 0, y = 0) => x + y
// console.log(fn(1, 2))
// 加括号的函数体返回对象字面量表达式
// const fn = uname => ({uname:uname}) //第一个uname是形参,第二个unmae是属性,第三个uname则是属性中的参数。为什么是({})的写法 首先 箭头函数的函数体用{ }包裹,而对象也需要{ }包裹,冲突了。
// console.log(fn('94'))
// 箭头函数参数:..args
// 例:用箭头函数求和
// const fn = (...args) => {
// let sum = 0
// for (let i = 0; i < args.length; i++) {
// sum += args[i]
// }
// return sum
// }
// console.log(fn(1, 2, 4, 5, 6))
// 箭头函数写对象
// const obj = {
// uname:'94',
// sayHi:()=>{
// }
// }
// 箭头函数this
// 在箭头函数出现之前,每一个新函数根据它 是被如何调用的 来定义这个函数的this值(谁调用这个函数,this就指向谁)
// 例(以前):console.log(this)
// function fn(){
// console.log(this)
// }
// window.fn()
// const obj = {
// name:'andy',
// sayHi:function(){ //console.log(this) 调用者为obj
// const fn = ()=>{
// console.log(this) //嵌套的函数是箭头函数,沿用上一级的this 上一级函数调用者为obj
// }
// }
// }
// obj.sayHi()
// 箭头函数不会创建自己的this,他只会从自己的作用域链的上一层沿用this
console