2 回答
TA贡献1856条经验 获得超17个赞
我不明白为什么这些例子不好
因为默认初始化程序不在父作用域内评估,而是在函数作用域内评估。参数本身已经在范围内,因此您可以执行以下操作
(function(a = 2, b = a) { console.log(b); }());
有人可以指出我在规范中可以澄清这一点吗?
相关章节是第9.2.12节FunctionDeclarationInstantiation。
我必须说,规范很难理解。
是的,尽管它是为引擎实现者而非程序员编写的。但是,解释性说明基本上可以确认您对优化的理解
如果函数的形式参数不包含任何默认值初始化程序,则主体声明将在与参数相同的环境记录中实例化。如果存在默认值参数初始化程序,则会为主体声明创建第二个环境记录。
您的示例基本上是对
(function() {
let a = arguments[0] !== undefined ? arguments[0] : b,
// ^ clearly a ReferenceError
b = arguments[1] !== undefined ? arguments[1] : 1;
{
}
})();
(function() {
let c = 1;
return (function() {
let a = arguments[0] !== undefined ? arguments[0] : c;
// ^ works as you'd think
{
return a === 1;
}
})();
})();
(function() {
let a = 1;
(function() {
let a = arguments[0] !== undefined ? arguments[0] : a;
// ^ again clearly a ReferenceError
{
}
})();
})();
(function() {
let b = 1;
(function() {
let a = arguments[0] !== undefined ? arguments[0] : b,
// ^ still a ReferenceError
b = arguments[1] !== undefined ? arguments[1] : 2;
{
}
})();
})();
(function() {
let a = arguments[0] !== undefined ? arguments[0] : () => b,
// ^ works indeed
b = arguments[1] !== undefined ? arguments[1] : 2;
{
return a() === 2;
}
})();
TA贡献1946条经验 获得超3个赞
因此,看起来a =案例无论如何都不可行。如果每个默认值都将在自己的范围内进行评估,则a = b的情况可能可行。但这对于引擎来说将是过多的开销,因此开发板的所有参数只能使用1个作用域。看起来这里的规范很明确。谢谢。
添加回答
举报