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

Posted

技术标签:

【中文标题】JS:默认函数参数值和范围【英文标题】:JS: Default function parameter values and scope 【发布时间】: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 开发工具中运行测试代码,确定范围 确实 根据是否为函数定义了默认参数而改变。 【参考方案1】:

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

【讨论】:

好的!这似乎可以解释它。我有一些关于 ECMAScript 2015 FunctionDeclarationInstantiation 和 Environment Records 的阅读资料。

以上是关于JS:默认函数参数值和范围的主要内容,如果未能解决你的问题,请参考以下文章

传入值为 nil 的函数参数的默认值

进阶 第一课:函数

newff函数的函数参数

执行输入参数的所有可能排列(二进制样式逻辑)

js设置函数参数默认值的3种方法

Python的多类型传值和冗余参数