Javascript中的模糊函数声明

Wei*_*ang 11 javascript declaration function forward-declaration

我是Javascript的新手,并对函数声明的工作方式感到困惑.我对此做了一些测试并得到了一些有趣的结果:

say();

function say()
{
    alert("say");
}
Run Code Online (Sandbox Code Playgroud)

前进声明工作和弹出"说"

相反

say();

say = function()
{
    alert("say");
}
Run Code Online (Sandbox Code Playgroud)

没有工作,虽然它也声明了一个函数对象

如果我们声明该函数并在之后重新声明:

function say()
{
    alert("speak");
}

say();

function say()
{
    alert("say");
}
Run Code Online (Sandbox Code Playgroud)

我得到"说"而不是"说话".这太令人惊讶了!

好.似乎只有最新的函数声明才有效.然后让我们首先声明函数对象,然后是"常规"函数:

say = function()
{
    alert("speak");
}

say();

function say()
{
    alert("say");
}

say();
Run Code Online (Sandbox Code Playgroud)

另一个惊喜,是"说话",然后是"说话"."常规"功能声明根本不起作用!

是否有所有这些的解释?并且,如果"常规"函数声明真的是"脆弱的"并且可以通过具有相同名称的函数对象轻松覆盖,那么我应该远离那个吗?

另一个问题是:只使用函数对象格式,前向声明是否变得不可能?有没有办法在Javascript中"模拟"它?

Eri*_*sen 0

您可以预期您的函数定义将按顺序应用。然后,所有非方法代码行都将按顺序执行,包括函数对象的赋值。这解释了你的每个例子。但这是一个有趣的问题。您确实无法在尝试调用函数对象对其进行赋值,并期望它能够工作。然而,可执行代码后面的函数定义实际上将首先被应用。