javascript - JS : Default function parameter values and scope

标签 javascript function parameters scope default-value

当为该函数分配默认参数值时,我对函数内的作用域和变量分配似乎如何变化感到有点困惑。

例如,当此函数将默认值分配给参数 i 时,output 数组变量在使用 Chrome Dev Console 检查时似乎是 block 范围的:

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

steps(10, 20);

a

但是,通过删除 i 的默认参数值,output 数组变量在本地范围内:

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 处理器在声明 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);

最佳答案

是因为default initialisers run in their own scope .只有在没有的情况下,主体代码才会在顶级功能范围内进行评估。如果将函数表达式放在默认初始化程序中,这只会有所不同,默认初始化程序可能会关闭其他参数,但无法访问将在主体中声明的变量。

基本上就是区别

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];
  }());
}

关于javascript - JS : Default function parameter values and scope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48331336/

相关文章:

javascript - simplehtmldom 触发点击元素

mysql - 如何在 MySQL 中使用用户定义的函数对 SELECT 查询进行排序?

php - 将代码转换为函数,但它不起作用

javascript - Angular Firestore 根据返回的 bool 值显示一个按钮,该 bool 值检查 Firestore 文档是否存在

c - C 语言中没有类型的函数参数

parameters - perl6 : how to specify multiple requirements for a parameter of a function?

javascript - 明示 promise 行不通

javascript - React 钩子(Hook)的奇怪行为 : delayed data update

javascript - 打开 JavaScript 文件时 Visual Studio 2008 崩溃?

C# 方法参数语法 - 这是什么意思?