为什么调用我的JavaScript函数会在我这样调用时抛出错误
wysiwyg2();
var wysiwyg2 = function()
{
alert(1);
}
但是当我这样做的时候会工作吗?
wysiwyg2();
function wysiwyg2 ()
{
alert(1);
}
答案 0 :(得分:11)
您需要首先定义您的函数变量,即
var wysiwyg2 = function()
{
alert(1);
}
wysiwyg2();
有关差异的详细解释,请参阅Why can I use a function before it’s defined in Javascript?
答案 1 :(得分:4)
在第一个片段中,您尝试在定义变量之前调用变量。
您将从以下代码中遇到同样的问题:
test.toString();
var test = new Date;
在第二个片段中,您将声明该函数而不将其分配给变量,这会导致在早期代码中可用的全局声明。
答案 2 :(得分:2)
你可以把你的javascript想象成两次通过评估。第一遍构建所有对象和名称(并记住:函数是对象),并将它们放在“范围内”,可以这么说。这有点像编译步骤。然后第二遍执行代码。
所以你的第二个样本是有效的,因为在执行之前构建了第一个pass并“限定”了该函数。第一个示例不起作用,因为函数对象是作为变量赋值的一部分创建的,因此当您尝试调用它时,它还不在范围内。
您在注释中提到了另一种情况,其中函数调用和定义分为两个脚本块。这不起作用,因为引擎完成一个块的两个步骤然后再转到下一个块,并且您尝试在块定义之前执行的块中调用该函数。您可以跨脚本块调用函数,但不能在它们被定义之前调用。
答案 3 :(得分:0)
在第一个中,您将声明一个函数并将其分配给变量。因此,在实际分配给变量之前,您将无法通过该变量调用它。
在第二个中,您将声明一个命名函数。并且可以从任何地方调用该函数(只要它在范围内)。
答案 4 :(得分:0)
当输入新的执行上下文(可以是函数调用或全局代码)时,JavaScript首先会经历一个变量实例化阶段,在此期间全局代码或函数中的所有变量声明和函数声明body被检查并创建为当前变量对象的属性,它实际上是当前范围内所有对象的集合。特别是任何函数声明,例如
function wysiwyg2 ()
{
alert(1);
}
...在此阶段完全创建,同时任何变量声明,如
var a = 2;
...只会导致在此阶段创建一个名为a
的变量,其值为undefined
。对于带有函数表达式的赋值的变量声明也是如此,例如
var wysiwyg2 = function()
{
alert(1);
}
此时仅发生变量实例化。完成此阶段后,其余代码(包括变量赋值)将按顺序执行。