Javascript 当我们定义一个从未使用过的函数时,它的缺点是什么?

Javascript 当我们定义一个从未使用过的函数时,它的缺点是什么?,javascript,function,Javascript,Function,我正在学习JavaScript,昨天我想我应该复习一些基础知识,所以我选择了“函数”主题。当我从中阅读此文档时,我看到: 注意:某些JavaScript引擎(不包括SpiderMonkey)错误地将任何具有名称的函数表达式视为函数定义。这将导致定义zero,即使条件始终为false有条件定义函数的更安全方法是匿名定义函数并将其分配给变量: 所以我的问题是,因为它说了一种更安全的方法,这意味着这种方法不安全:会有什么问题 谢谢。当您使用var声明变量时,它位于范围的顶部。因此,您可以编写如下代码:

我正在学习JavaScript,昨天我想我应该复习一些基础知识,所以我选择了“函数”主题。当我从中阅读此文档时,我看到:

注意:某些JavaScript引擎(不包括SpiderMonkey)错误地将任何具有名称的函数表达式视为函数定义。这将导致定义
zero
,即使条件始终为false有条件定义函数的更安全方法是匿名定义函数并将其分配给变量:

所以我的问题是,因为它说了一种更安全的方法,这意味着这种方法不安全:会有什么问题


谢谢。

当您使用
var
声明变量时,它位于范围的顶部。因此,您可以编写如下代码:

if (someCondition) {
  var zero = function zero() {
    // do stuff
  };
}
if (zero) {
  zero();
}
正确执行时,如果
someCondition
false
,则
zero
将始终为
undefined

如果发动机不正确地使用命名函数表达式作为函数定义,则它也将被提升,这意味着在检查
someCondition
之前,
zero
将是一个函数。这意味着无论某个条件是什么,
zero
都将有一个“truthy”值


基本上,任何时候,如果您希望某个值
未定义
,因为您没有实际为其指定命名函数,那么它实际上会被指定给一个函数,假设您将该函数命名为与变量相同的东西。

当您使用
var
声明变量时,它位于范围的顶部。因此,您可以编写如下代码:

if (someCondition) {
  var zero = function zero() {
    // do stuff
  };
}
if (zero) {
  zero();
}
正确执行时,如果
someCondition
false
,则
zero
将始终为
undefined

如果发动机不正确地使用命名函数表达式作为函数定义,则它也将被提升,这意味着在检查
someCondition
之前,
zero
将是一个函数。这意味着无论某个条件是什么,
zero
都将有一个“truthy”值


基本上,任何时候,如果您希望某个值
未定义
,因为您实际上没有给它指定一个命名函数,那么它实际上会被指定给一个函数,假设您将该函数命名为与变量相同的东西。

这里没有不准确的地方,但是这个答案与
var
scoping有关,而不是SpiderMonkey不安全地将函数表达式错误地解释为声明。我添加了关于如何提升函数声明的信息,因此将为
zero
创建一个定义值。我检查了提升文档,它说变量可以在范围顶部声明。感谢@MikeC提供有用的链接。这里没有不准确的地方,但这个答案与
var
作用域有关,而不是SpiderMonkey不安全地将函数表达式误解为声明。@DanPrince不是真的。我添加了关于如何提升函数声明的信息,因此将为
zero
创建一个定义值。我检查了提升文档,它说变量可以在范围顶部声明。感谢@MikeC提供有用的链接。