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