java_66666 2018-08-23 09:39 采纳率: 0%
浏览 1081
已结题

ES6 函数参数的默认值 疑惑

图片说明

为什么在外面使用var就会报错?在里面就不会报错?

 function fn(x=8){
  var x = 89;
  console.log(x);//不报错
}
fn();
let y = 7;
var y = 8;//报错
  • 写回答

4条回答 默认 最新

  • whs_321 2018-08-23 09:41
    关注

    函数的参数相当于var 出来的变量,var重复定义不会报错

    Elasticsearch顶尖高手系列

    评论
  • 杨家八公子 2018-08-23 10:19
    关注

    形参就相当于是 var x=5了,var过的变量是不能重复定义的

    评论
  • 天际的海浪 2018-08-23 10:20
    关注

    函数的参数等同用var声明的变量。
    let 和 const 不能对同一作用域中已经存在的变量重复声明。重复声明会报错。
    var对变量重复声明不会报错,但第一次之后的声明会被自动忽略。

    评论
  • devmiao 2018-08-23 15:47
    关注

    在ES6之前,不能直接为函数的参数指定默认值,只能采取变通的方法。

    function log(x,y){
    y = y||'world';
    console.log(x,y);
    }
    log('kkk');//kkk world

    这种写法的缺点在于:
    如果参数y赋值了,但是对应的布尔值为false,则该赋值不起作用。如果在调用函数的时候,传入的y参数是一个空字符串,那么y就会被修改为默认值。
    避免这个问题,需要先判断一下:1.通过判断值是否等于undefined,2.判断arguments.length是否为1.

    但是ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。

    function log(x,y='world'){
    console.log(x,y);
    }
    log('hello'); //hello world

    ES6语法的好处:
    1.简洁
    2.阅读代码的人可以看出哪些参数是可以省略的,不用查看函数体或文档
    3.有利于将来的代码优化,即使未来的版本即使拿掉这个参数,以前的代码也可以运行
    还有参数变量是默认声明的,不能在函数体内部再进行声明。

    与解构赋值默认值结合使用
    这里有两种写法需要区分一下:

    function m1({x=0,y=0} = {}){
    return [x,y];
    }
    function m2({x,y} = {x:0,y:0}){
    return [x,y];
    }
    m1({x:3});//[3,0]
    m2({x:3});//[3,undefined]
    m1({});//[0,0]
    m2({});//[undefined,undefined]

    评论

报告相同问题?

悬赏问题

  • ¥15 act_ge_bytearray的草稿json数据复制到act_de_model 的model_editor_json的脚本
  • ¥15 cvi使用CreateThread创建线程时,出现存储空间不足无法处理此命令的错误
  • ¥15 求苹果推信imessage批量推信技术
  • ¥15 ubuntu 22.04 系统盘空间不足。隐藏的docker空间占用?(相关搜索:移动硬盘|管理系统)
  • ¥15 利用加权最小二乘法求亚马逊各类商品的价格指标?怎么求?
  • ¥15 c++ word自动化,为什么可用接口是空的?
  • ¥15 Matlab计算100000*100000的矩阵运算问题:
  • ¥50 VB6.0如何识别粘连的不规则的数字图片验证码
  • ¥16 需要完整的这份订单所有的代码,可以加钱
  • ¥30 写一个带界面控制的机房电脑一键开机关机并且实时监控的软件