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对象就是定义时所在的对象,而不是使用时所在的对象。
浙公网安备 33010602011771号