ES6函数扩展(函数参数默认值)

一、函数的默认参数基本使用方法
function test(x,y = "hello"){
     
	console.log("函数参数:",x,y);
}
test("winne");      //函数参数:winne hello
test("winne","hi"); //函数参数:winne hi

如上代码我们可以看出,当函数参数有了默认值可以不传入那个参数,那么就直接使用默认的参数。

注意:参数变量是默认声明的,不能用let和const再次声明:

function f (a = 1){
     
    let a = 2; // Uncaught SyntaxError: Identifier 'a' has already been declared
}

注意:默认值后面不能再出现没有默认值的参数!

二、关于默认参数的作用域问题
let x = "test";
function test(x,y = x){
     
	console.log("作用域问题:",x,y);
}
function test2(a,y = x){
     
	console.log("作用域问题:",a,y);
}

test();         //作用域问题:undefined  undefined
test("winne");  //作用域问题:winne  winne
test2("雪");    //作用域问题:雪  test

1、分析下上面的代码test()为什么x,y都是undefined呢?
主要是在函数的参数中也是对变量x进行了声明,其实为下面写法的简写,一般省略了let:

function test(let x, let y = x){
     
	console.log("作用域问题:",x,y);
}

此时在调用test()的时候什么参数都没有传入,那么函数参数那里的声明就是的x为undefined了,所以再赋值给y,那么y也是undefined了。

2、分析代码调用test2(“雪”)为什么a = “雪” ,y = “test” ?
首先我们知道,a = "雪"是传入的参数。那么第二个参数y没有传入,在函数参数的y声明中把x赋值给了y,但是此时x并不能在函数参数中找到有他的声明,那么他就会像上级(父级作用域查找),找到了let x = “test” ,这时拿到了x的值就赋值了y了。

ps:这里对作用域的理解如果还是不够理解,点击下面链接去学习一下js的执行上下文和js作用域。
https://blog.csdn.net/m0_38134431/article/details/84983396

你可能感兴趣的:(函数默认参数,es6)