Javascript自执行函数是否像编译程序一样工作

Does a Javascript self executing function work like a compiled program

本文关键字:一样 工作 编译程序 执行 函数 是否 Javascript      更新时间:2023-09-26

Javascript自执行函数是否像编译程序一样工作。I.e你能在一个自执行函数中的一个命名匿名函数之后声明一些函数,并让命名匿名函数在运行时定位另一个函数吗?I.e为什么以下内容有效?

我认为您不能提升命名匿名函数,因为它们只在运行时创建,所以自执行函数可能会"编译"代码,使命名匿名函数可用于调用它的函数!!

(function(){
    var myFunc = function(){
        var bar = "Bar";
        return myFunc2() + bar;
    }
    function myFunc2(){
        return "Foo ";
    }
})()

甚至

(function(){
    function myFunc(){
        var bar = "Bar";
        return myFunc2() + bar;
    }
    var myFunc2 = function(){
        return "Foo ";
    }
    window.fooBar = myFunc();
})()
console.log(fooBar);

这个特定的例子之所以有效,是因为myFunc2从未被调用,因为myFunc从未被调用。

不过,一般来说,JS范围、吊装和时间的正常规则适用:

变量必须在使用之前填充,而不是在定义调用时将使用它的函数之前填充。

让我们看看代码中实际发生了什么。

1.您有一个执行变量赋值的函数:var myFunc=;

2.你声明了一个函数。(但还没有调用它)

3.您将myFunc分配给window.foobar.

4.然后你调用了你定义的函数。

现在,这些步骤发生了:

  1. myFunc获取一个函数作为其值。

  2. myFunc2被定义。

  3. window.foobar获取调用myFunc()的结果。因此,myFunc()返回调用myFunc2()的结果,并将其结果附加到bar。

因此,window.foobar的值将为"foobar"。

(不,编译后的程序不是这样工作的)

(function(){
    var myFunc = function(){
        var bar = "Bar";
        return myFunc2() + bar;
    }
    function myFunc2(){
        return "Foo ";
    }
})()

经过一段时间的吊装,这是因为:

(function(){
    var myFunc;
    function myFunc2(){
        return myFunc2() + bar;
    }
    myFunc = function(){
        var bar = "Bar";
        return "Foo ";
    }
})()

实际上,如果您调用myFunc();并记录myFunc2的返回值,您将获得Foo Bar。

当提升命名的匿名函数(实际上是函数表达式)时,仅var myFunc(=未定义);被吊起。然后任务保持在同一级别。

此外,您不能将此函数称为自执行函数(因为自执行函数实际上是递归)。这就是立即调用函数表达式。

@Quentin说了剩下的:在使用变量之前,必须填充它,而不是在定义一个在调用时使用它的函数之前。