es6中函数的扩展

1、函参默认值

函数参数允许指定默认值,不传或传undifined时,默认值生效

function foo(x = 5){
}

foo() // 5
foo(6)  // 6

2、与解构赋值默认值结合使用

function foo({x, y = 5}){
}

foo({})  // undifined, 5
foo({x: 1})  // 1, 5
foo({x: 1, y: 2})  // 1, 2
foo()  // error

以上使用的是对象的解构赋值,没有使用函数参数的默认值

function fetch(url, {body = '', method = 'GET', headers = {}} = {}){
}

默认值也可以是一个函数,利用参数默认值可以指定某一参数不得省略

function throwMisssing(){
    throw new Error('missing param')  
}

function foo(params = throwMisssing()){
}

foo()

3、函数参数默认值的作用域

一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域会消失。

调用f(2)时,首先形成一个参数作用域,x指向调用参数2,y指向这个作用域的x,也是2

var x = 1
function f(x, y = x){
     console.log(y) 
} 

f(2)   // 2

调用f()时,参数y未传,使用默认值x,在参数作用域内x未定义,指向全局变量x(此处的x与方法体中定义的x不在同一作用域,不是同一变量,互相独立)

let x = 1

function f(y = x){
    let x = 2
    console.log(y)
}

f()  // 1

参数作用域的x最终指向全局变量,但全局未定义x

function f(y = x){
    let x = 2
    console.log(y)
}

f()  // error,x is not defined

如果参数的默认值是一个函数,该函数的作用域也遵守这个规则。

调用bar(),参数为空,func使用默认值,即调用方法返回变量foo,foo在参数作用域未定义,使用全局变量 foo

let foo = 'outer'

function bar(func = x => foo){
    let foo = 'inner'
    console.log(func())
}

bar() // outer

以下是一个更复杂的例子

var x = 1
function(x, y = function(){x = 2}){
    var x = 3
    y()
    console.log(x)
}

foo()  // 3
x // 1

方法体里的x与其它x不在同一作用域,彼此独立

如果方法体里的var去掉,x指向的就是全局变量,最终打印的就是2

4、箭头函数

函数体内的this对象就是定义时所在的对象,而不是使用时所在的对象。

posted @ 2022-06-22 13:59  贰零伍零  阅读(25)  评论(0)    收藏  举报