es6-函数

来源:互联网 发布:云网络验证 编辑:程序博客网 时间:2024/06/05 11:46

参考以下博客,建议查看原博客,它更为详细;
ES6 阮一峰

参数的默认值

可以为函数的参数设定默认值;

function a (b=5){console.log(b);}a(); //5a(1); //1

上面的代码意思为;如果函数a被调用时,掺入了参数,那么参数b=传入的参数;如果没有传入参数,那么参数b=5;

注意参数是默认被声明的,不允许重复声明;

function a (b=5){let b = 'xyd';console.log(b);}a(); //报错a(1); //报错

函数a的参数 b已经被默认声明过,let b时,就会报错;(var是可以,let和const都不允许重复声明变量);

函数的参数名不允许重复;

function a (a,b,b){    console.log(a,b,b);}a(1,2,3); //报错

如果函数的参数默认值是一个变量,当调用函数时,就是重新计算参数默认的值;

if(true){    let y = 1;    function a(x=y+1){        console.log(x)    }    a(); //2    y = 2;    a();//3}

上面的代码: 函数a的参数 x 的默认是 y+1,而y是一个变量;当调用a时,它的参数x的默认就会重新计算,而不是默认为2( y+1 =2);
所以第一调用时x = 2;
第二次调用时,这时的y=2;y+1=3;所以运行结果是3;这表示如果函数的参数默认值是一个变量,当调用这个函数时它的参数默认值就会重新计算;

函数参数与解构赋值,默认值

与对象解构赋值

 function xyd({a,b}={a:1,b:2}){     console.log(a,b) } xyd({a:5, b:6}); //5,6 xyd({a:4});    //4,undefiend xyd({}) // undefiend,undefiend; xyd() //1,2

这里的函数参数的默认值是一个具体的对象属性,没有使用对象解构赋值的默认值;

xyd ( {a:5, b:6 } ); a被赋值为5,b被赋值为6;

xyd ( {a:4 } ); a被赋值为4,这里的参数a和b都是对象解构赋值,b没有解构成功,undefiend;

xyd( { }); 传入了一个空对象,这里a和b都没有解构成功;undefiend;

xyd( ); 执行 {a,b}={a:1,b:2} ,解构成功,//1,2

与对象解构赋值的默认值,与上面的区别是,它设置了对象解构赋值的默认值;

function xyd({a=1,b=2} = {} ) {    console.log(a,b);}xyd(); //1,2 没有传值;a和b的默认值为1,2xyd({}); //1,2 传入一个空对象,因为设置了解构对象赋值的默认值,所以这里a=1,b=2;xyd({a:3});//3,2 只传入了a,b因为设置了解构对象赋值的默认值,所以b=2;xyd({a:5,b:6}); //5,6 a和b赋值

函数参数的默认位置

如果设置了函数参数的默认值,它应该在函数参数的尾部,这样也容易看出省略了哪些参数;
如果设置了函数参数的默认值,不是在函数参数的尾部,那么这个参数在调用时,就无法被省略;

function xyd(x=1,y){    console.log(x,y);}xyd(,2)//报错,不能省略参数x;

## 函数的Length ##
h函数的Length 返回函数参数的长度;注意:如果参数设定了默认值,那么length将不包含这个参数;

console.log((function (a,b){}).length); //2console.log((function (a,b=1){}).length)//1,参数b设定了默认值,length不将不会包含它;

## 参数的作用域 ##
z当实行函数时,它的参数就会形成以个单独的作用域;

var x='xyd';function xyd(x=1,y=x){    console.log(y);}xyd();//1;

当运行函数xyd()时,参数形成了一个单独的作用域;y指向参数x(x=1),
而不是指向var x=’xyd’

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

上面的函数xyd运行时,它的参数形成了自己的作用域,参数y的默认值函数中x指向了参数x,而xyd函数内部又声明了一个变x,当运行y时,由于它的x指向的是参数x,参数形成了自己的作用域,修改的是参数x的值,而不是xyd函数内部声明的x,所以运行结果是3;
而在函数xyd()外面打印的x指向是var x= 1;所以这里的打印结果是1;

如果把函数xyd()内部声明的变量x去掉,这时候打印的x就是参数y中赋值的变量x=2;也就是参数x;运行y后,参数x的值为2;打印结果为2;

var x = 1;function xyd(x, y = function() { x = 2; }) {  y();  console.log(x);}foo(); //2console.log(x);//1
原创粉丝点击