函数变量声明时, 有先后顺序之分, 不会变量提升吗?
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
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
我理解你的意思,其他两位确实没看懂你的问题,不过你也确实误导别人了,这和变量提升没有任何关系,你可以试试:
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 的新特性,该特性和 let
、const
一样,存在着暂时性死区 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);
这样又报错了。
13 回答12.6k 阅读
7 回答1.7k 阅读
3 回答1k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
2 回答1.8k 阅读
2 回答1k 阅读✓ 已解决
先不管提升不提升的问题,在各
z
初始化的时候就错了,违背了最基本的如果访问一个未声明的变量会导致抛出一个引用错误(ReferenceError)异常
这个y
明显是未声明的变量。关于变量提升
在 ECMAScript 6 中,let(const)将不会提升变量到代码块的顶部