函数扩展

it2023-01-13  53

文章目录

一. 函数参数的默认值1. ES6设置默认参数4. 默认参数的位置5. 结合对象解构赋值6. 函数的参数默认已经定义了,不能再用let,const声明 二. 默认参数对函数length的影响三. 默认值与作用域

一. 函数参数的默认值

1. ES6设置默认参数

传参就使用传入的参数, 没有就使用默认参数

function show(a = 'hello', b = 'world') { console.log(a, b) } show() // hello world show('世界', '你好') // 世界 你好

4. 默认参数的位置

function f(x = 1, y) { return [x, y]; } f() // [1, undefined] f(2) // [2, undefined]) f(undefined, 1) // [1, 1]

5. 结合对象解构赋值

function show({a = "欢迎",b = "无为"}){ console.log(a,b); } show({a:"welcome",b:"wuwei"}); // welcome wuwei show({b:"wuwei"}); //欢迎 wuwei show({}); // 欢迎 无为 // 但是这样就报错 function show({a = "欢迎",b = "无为"}){ console.log(a,b); } show(); // 报错 // 所以我们对象也得给一个默认值 function show({a = "欢迎",b = "无为"} = {}){ console.log(a,b); } show(); // 欢迎 无为

6. 函数的参数默认已经定义了,不能再用let,const声明

function show(age = 18){ let age = 20; console.log(age); } show(); // 程序报错,age已经被定义过了 // Uncaught SyntaxError: Identifier 'age' has already been declared

二. 默认参数对函数length的影响

参数指定默认值后,length不会包含该参数

(function (a) {}).length // 1 (function (a = 5) {}).length // 0 (function (a, b, c = 5) {}).length // 2 fn.length 返回形参个数arguments.length 返回实参个数

三. 默认值与作用域

一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。

var x = 1; function f(x, y = x) {//AO{x:2,y:2} console.log(y); } f(2) // 2

上面代码中,参数y的默认值等于变量x。调用函数f时,参数形成一个单独的作用域。在这个作用域里面,默认值变量x指向第一个参数x,而不是全局变量x,所以输出是2。

let x = 1; function f(y = x) { //AO{y:1,x:2} let x = 2; console.log(y); } f() // 1

上面代码中,函数f调用时,参数y = x形成一个单独的作用域。这个作用域里面,变量x本身没有定义,所以指向外层的全局变量x。函数调用时,函数体内部的局部变量x影响不到默认值变量x。

var x = 1; function foo(x = x) { //AO{x:1} // ... } foo() // ReferenceError: x is not defined

上面代码中,参数x = x形成一个单独作用域。实际执行的是let x = x,由于暂时性死区的原因,这行代码会报错”x 未定义“。

最新回复(0)