【发布时间】:2018-06-28 02:50:21
【问题描述】:
在为该函数分配默认参数值时,我对函数内的范围和变量分配似乎如何变化感到有些困惑。
例如,当此函数具有分配给参数 i 的默认值时,使用 Chrome 开发控制台检查时,output 数组变量似乎是块范围的:
function steps(n, i = 40) {
var output = [n];
}
steps(10, 20);
但是,通过删除 i 的默认参数值,output 数组变量的范围是本地的:
function steps(n, i) {
var output = [n];
}
steps(10, 20);
为什么为参数 i 分配默认值会影响 输出 数组变量的范围?
我最初是通过尝试通过 pythontutor.com 的 Javascript 实时编程环境运行以下代码段来意识到函数范围的这种转变。即使代码在 IDE 中按预期执行,由于 pythontutor 上的范围问题,它无法运行:
function steps(n, i = 1) {
// declare base case
if (n === 0)
return;
var output = [];
print(i, "#");
print(n - 1, " ");
console.log(output.join(""));
// make recursive call
steps(n - 1, i + 1);
function print(num, char) {
for (let j = 0; j < num; j++) {
output.push(`${char}`);
}
}
}
steps(3);
pythontutor 处理器在声明 output 变量之后调用 print() 时停止执行三个步骤。但是,如果我首先全局声明 output 变量,Pythontutor.com 将按预期执行代码:
var output = [];
function steps(n, i = 1) {
// declare base case
if (n === 0)
return;
output = [];
print(i, "#");
print(n - 1, " ");
console.log(output.join(""));
// make recursive call
steps(n - 1, i + 1);
function print(num, char) {
for (let j = 0; j < num; j++) {
output.push(`${char}`);
}
}
}
steps(3);
【问题讨论】:
-
你在使用 babel 吗?如果它被重写,它可能会改变访问参数的方式。
-
从头开始,直接在 chrome 开发工具中运行测试代码,确定范围 确实 根据是否为函数定义了默认参数而改变。
标签: javascript function parameters scope default-value