JS:默认函数参数值和范围

时间:2018-01-18 22:28:09

标签: javascript function parameters scope default-value

我对范围和范围有点困惑在为该函数分配默认参数值时,函数中的变量赋值似乎会发生变化。

例如,当此函数的默认值分配给参数 i 时,输出数组变量在使用Chrome Dev Console进行检查时似乎是块作用域的:

function steps(n, i = 40) {
 var output = [n];
}

steps(10, 20);

a

但是,通过删除 i 的默认参数值,输出数组变量的作用域是本地的:

function steps(n, i) {
  var output = [n];
}

steps(10, 20);

enter image description here

为什么为参数 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处理器在声明输出变量之后,在 print()的调用中停止执行三个步骤。但是,如果我首先在全局声明输出变量,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);

1 个答案:

答案 0 :(得分:1)

这是因为default initialisers run in their own scope。只有在没有的情况下,才会在顶部函数范围内计算正文代码。如果你将一个函数表达式放在一个默认的initaliser中,它可能会有所不同,它可能会关闭其他参数,但是无法访问将在正文中声明的变量。

基本上它是

之间的区别
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];
  }());
}