JavaScript函数声明之间的区别?

JavaScript函数声明之间的区别?,javascript,Javascript,当我这样调用JavaScript函数时,为什么调用它会引发错误 wysiwyg2(); var wysiwyg2 = function() { alert(1); } 但是当我这样做的时候,你会工作吗 wysiwyg2(); function wysiwyg2 () { alert(1); } 您需要首先定义函数变量,即 var wysiwyg2 = function() { alert(1); } wysiwyg2(); 有关差异的详细解释,请参见您需要首先

当我这样调用JavaScript函数时,为什么调用它会引发错误

wysiwyg2();

var wysiwyg2 = function()
{
    alert(1);
}
但是当我这样做的时候,你会工作吗

wysiwyg2();

function wysiwyg2 ()
{
    alert(1);
}

您需要首先定义函数变量,即

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

wysiwyg2();

有关差异的详细解释,请参见

您需要首先定义函数变量,即

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

wysiwyg2();

有关差异的详细解释,请参见第一个代码段中的

,您试图在定义变量之前调用变量

您将从以下代码中得到相同的问题:

test.toString();
var test = new Date;

在第二个代码段中,您在声明函数时没有将其分配给变量,这将导致在早期代码中可用的全局声明。

在第一个代码段中,您试图在定义变量之前调用变量

您将从以下代码中得到相同的问题:

test.toString();
var test = new Date;

在第二个代码段中,您在声明函数时没有将其分配给变量,这将导致在早期代码中可用的全局声明。

在第一个代码段中,您在声明函数并将其分配给变量。因此,在实际分配给该变量之前,您无法通过该变量调用它


在第二个示例中,您将声明一个命名函数。并且可以从任何地方调用该函数(只要它在范围内)。

在第一个函数中,您声明一个函数并将其分配给一个变量。因此,在实际分配给该变量之前,您无法通过该变量调用它


在第二个示例中,您将声明一个命名函数。并且可以从任何地方调用该函数(只要它在范围内)。

您可以将javascript看作是在两个过程中进行计算的。第一步构建所有对象和名称(记住:函数就是对象),并将它们放在“范围”中。这有点像一个编译步骤。然后第二遍执行代码

因此,您的第二个示例可以工作,因为第一个过程在执行之前构建并“确定”了函数的范围。第一个示例不起作用,因为函数对象是作为变量赋值的一部分创建的,因此当您尝试调用它时,它还不在范围内


您在注释中提到了另一种情况,其中函数调用和定义分为两个脚本块。这不起作用,因为引擎在进入下一个块之前完成了一个块的两个步骤,并且您尝试在定义该函数的块之前执行的块中调用该函数。您可以跨脚本块调用函数,但必须先定义它们。

您可以将javascript看作是在两个过程中计算的。第一步构建所有对象和名称(记住:函数就是对象),并将它们放在“范围”中。这有点像一个编译步骤。然后第二遍执行代码

因此,您的第二个示例可以工作,因为第一个过程在执行之前构建并“确定”了函数的范围。第一个示例不起作用,因为函数对象是作为变量赋值的一部分创建的,因此当您尝试调用它时,它还不在范围内

您在注释中提到了另一种情况,其中函数调用和定义分为两个脚本块。这不起作用,因为引擎在进入下一个块之前完成了一个块的两个步骤,并且您尝试在定义该函数的块之前执行的块中调用该函数。您可以跨脚本块调用函数,但必须先定义它们。

在输入新的执行上下文(即函数调用或全局代码)时,JavaScript首先经历一个变量实例化阶段,在此阶段,全局代码或函数体中的所有变量声明和函数声明都将被检查并创建为当前变量对象的属性,当前变量对象实际上是当前范围内所有对象的集合。特别是,任何函数声明,例如

。。。在此阶段完全创建,而任何变量声明,如

var a=2

。。。在这个阶段,只会导致创建一个名为
a
的变量,其值为
undefined
。对函数表达式赋值的变量声明也是如此,例如

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

当输入新的执行上下文(函数调用或全局代码)时,JavaScript首先经历一个变量实例化阶段,在此阶段,全局代码或函数体中的所有变量声明和函数声明都将被检查并创建为当前变量对象的属性,当前变量对象实际上是当前范围内所有对象的集合。特别是,任何函数声明,例如

。。。在此阶段完全创建,而任何变量声明,如

var a=2

。。。在这个阶段,只会导致创建一个名为
a
的变量,其值为
undefined
。对函数表达式赋值的变量声明也是如此,例如


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

此问题需要更好的标题。此问题需要更好的标题。但这也是错误的:wysiwyg2();函数wysiwyg2(){alert(1);}但这也是错误的:wysiwyg2();函数wysiwyg2(){alert(1);}