在函数中,当为参数i分配默认值时,作用域和变量赋值似乎会发生变化,这让我有点困惑。
例如,当此函数的参数具有默认值时,output数组变量在使用Chrome开发者工具进行检查时似乎被块级作用域限制:
function steps(n, i = 40) {
var output = [n];
}
steps(10, 20);
然而,通过移除 i 的默认参数值,输出 数组变量的作用域仅限于本地:
function steps(n, i) {
var output = [n];
}
steps(10, 20);
为什么给参数 i 赋默认值会影响 output 数组变量的作用域?
我最初是通过尝试在 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);