JavaScript函数声明之间的区别?

时间:2009-12-11 03:23:41

标签: javascript

为什么调用我的JavaScript函数会在我这样调用时抛出错误

wysiwyg2();

var wysiwyg2 = function()
{
    alert(1);
}

但是当我这样做的时候会工作吗?

wysiwyg2();

function wysiwyg2 ()
{
    alert(1);
}

5 个答案:

答案 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);
}

此时仅发生变量实例化。完成此阶段后,其余代码(包括变量赋值)将按顺序执行。