【问题标题】:Why can't function declaration be accessed after enclosed in parentheses?为什么用括号括起来后不能访问函数声明?
【发布时间】:2021-05-16 12:37:25
【问题描述】:

函数声明不能​​再通过其名称访问:

(function log(){
  console.log('print some information')
})
log()

代码抛出引用错误。我对此的理解是:函数log 不存在于任何内部范围内,为什么我不能直呼其名?

【问题讨论】:

  • 当你封装一个这样的函数时,它会在它自己的执行范围内运行。意味着它将在被javascript引擎读取后运行该函数。
  • 你为什么要把这个函数括在括号里?你希望达到什么目标?
  • @DeanVanGreunen 通常这就是函数实例化被括号括起来的原因,但在这种情况下,没有() 来调用函数(除了它不起作用的地方)。
  • @DeanVanGreunen 是的,谢谢,我知道。这不是这个问题所要尝试的;它是关于在function 关键字之后给出的名称是如何(嗯,在哪里)绑定的。
  • @DeanVanGreunen 括号不会自行创建范围,同样,因为没有 调用,它不是 IIFE(“立即调用函数表达式”)。问题是函数实例化表达式中的函数名称仅绑定为对inside创建函数的引用。

标签: javascript function scope


【解决方案1】:

为什么我不能直呼其名?

当您在function 周围加上括号时,您会得到function expression,而不是function declaration,因为解析器希望在() 之间看到expression 而不是声明。函数表达式名称只能在该函数本地访问:

如果要在函数体内引用当前函数, 您需要创建一个命名函数表达式。 这个名字就是 仅限于函数体(范围)

-MDN

这同样适用于其他运算符,例如 !+,而不仅仅是 (),这会使您的函数被视为函数表达式。

如果你想创建一个函数声明,你可以去掉括号:

function log(){
  console.log('print some information');
}
log();

【讨论】:

  • 谢谢,兄弟,我明白了。由于括号内没有函数声明,我怎样才能仍然以声明的方式调用该函数
  • @Aibin 最后一个代码 sn-p 示例展示了如何进行函数声明然后调用它。
猜你喜欢
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 2017-12-05
  • 2012-02-21
  • 2016-07-21
  • 2011-07-14
  • 2013-06-16
相关资源
最近更新 更多