【问题标题】:In JavaScript, what is the scope of a function declared within the condition of an if statement? [duplicate]在 JavaScript 中,在 if 语句的条件中声明的函数的范围是什么? [复制]
【发布时间】:2021-04-26 00:30:15
【问题描述】:

我最近遇到了一个面试问题,向我展示了这段代码(没有答案),并询问将打印到控制台的内容:

var i = 1;

if(function f(){}) {
  i += typeof f;
}

console.log(i);

// prints "1undefined"

我知道 typeof 返回一个字符串。隐式类型转换将来自 typeof 评估的字符串和数字组合成 '1undefined'。但是,我认为它会打印 '1function'。

我不完全明白,为什么 f 不在范围内?

这甚至不是范围问题吗?函数声明是否仅仅是一个逻辑表达式,它作为 if 语句的一部分被评估为 true,然后不再存在于任何范围内?

任何澄清将不胜感激。

【问题讨论】:

  • 函数在括号中声明,不向下传递。在括号内,您可以使用它。
  • 这种情况下的函数名不应该绑定到封闭范围内。在一些旧的浏览器中,它是(错误的),但我认为这已经很多年了。函数名只绑定在函数内部,所以外部没有符号f
  • @Rojo 不,它根本没有在外部绑定(到函数本身)。

标签: javascript if-statement scope expression type-coercion


【解决方案1】:

函数语句在括号内。这使它成为一个函数表达式,而不是一个函数声明

变量f只存在于函数内部

(function f(){ /* i.e. here */ })

在函数之外没有f,所以你会得到undefined,就像你对当前范围内不存在的任何其他变量一样。

console.log(typeof f);

【讨论】:

    【解决方案2】:

    f 不在作用域内,因为它是一个内联命名函数表达式。它不是一个函数声明。差异很微妙但很重要 -

    // declaration
    function f () { ... }
    
    // named function expression
    const foo = function f () { ... }
    
    // named arrow expression
    const f = () => { ... }
    
    // unnamed arrow expression
    () => { ... }
    

    if 的语义帮助我们理解 -

    if (<expression>) {
      <consequent>
    } else {
      <alternative>
    }
    

    如您所见,提供给if 语句的条件必须是表达式。您不能在表达式中声明变量。这包括函数声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-08
      • 2016-05-27
      • 2012-04-21
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      相关资源
      最近更新 更多