JS:默认函数参数值和作用域
JS: Default function parameter values and scope
当为该函数分配默认参数值时,我对函数内的作用域和变量分配似乎如何变化感到有点困惑。
例如,当此函数将默认值分配给参数 i 时,output 数组变量似乎是块范围的当使用 Chrome Dev Console 检查时,:
function steps(n, i = 40) {
var output = [n];
}
steps(10, 20);
但是,通过删除 i 的默认参数值,output 数组变量在本地范围内:
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);
因为。仅当有 none 时,主体代码才会在顶级函数范围内进行评估。如果将函数表达式放在默认初始化器中,这只会有所不同,默认初始化器可能会关闭其他参数,但无法访问将在主体中声明的变量。
基本上就是
的区别
function steps() {
var n = arguments[0],
i = arguments[1];
var output = [n];
}
和
function steps() {
var n = arguments[0],
i = arguments.length > 0 ? arguments[1] : 40;
(() => {
var output = [n];
}());
}
当为该函数分配默认参数值时,我对函数内的作用域和变量分配似乎如何变化感到有点困惑。
例如,当此函数将默认值分配给参数 i 时,output 数组变量似乎是块范围的当使用 Chrome Dev Console 检查时,:
function steps(n, i = 40) {
var output = [n];
}
steps(10, 20);
但是,通过删除 i 的默认参数值,output 数组变量在本地范围内:
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);
因为
基本上就是
的区别function steps() {
var n = arguments[0],
i = arguments[1];
var output = [n];
}
和
function steps() {
var n = arguments[0],
i = arguments.length > 0 ? arguments[1] : 40;
(() => {
var output = [n];
}());
}