函数实参形参以及ES6函数默认值

函数变量声明时, 有先后顺序之分, 不会变量提升吗?
var x = 5;
function a(z=y, y=x+5) {
    // 相当于在函数内部做了以下声明
    // var z = y, y = x + 5;
    y++;
    console.log(z);
}

a(); // Uncaught ReferenceError: y is not defined
拿ts试了一下, 确实报错了图片描述
但为何没有变量提升呢? 难道用的是let关键字么
阅读 2.5k
3 个回答

先不管提升不提升的问题,在各z初始化的时候就错了,违背了最基本的如果访问一个未声明的变量会导致抛出一个引用错误(ReferenceError)异常 这个y明显是未声明的变量。
关于变量提升在 ECMAScript 6 中,let(const)将不会提升变量到代码块的顶部

clipboard.png
楼上正解, 这里错了

我理解你的意思,其他两位确实没看懂你的问题,不过你也确实误导别人了,这和变量提升没有任何关系,你可以试试:

var x = 5;
var y = 0;
function a(z=y, y=x+5) {
    // 相当于在函数内部做了以下声明 (*)
    // var z = y, y = x + 5;
    y++;
    console.log(z);
}

a();

一样报错。
所以星标处的注释并不正确。
默认参数是 ES6 的新特性,该特性和 letconst 一样,存在着暂时性死区 TDZ,因为默认参数在函数调用时会初始化(假如你没有传值或传了 undefined 的话),这和你有没有定义该变量无关,那么在还没有初始化该变量的时候,是不允许访问的,所以该变量就是未定义。
举两个例子:

var x = 5;
function a(z=y, y=x+5) {
    y++;
    console.log(z);
}

a(3);

这样就没有错。

var x = 5;
function a(z=y, y=x+5) {
    y++;
    console.log(z);
}

a(undefined, 3);

这样又报错了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题