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

时间:2013-08-21 12:31:42

标签: javascript function

Javascript自执行功能是否像编译程序一样工作。即,您可以在自执行函数中的命名匿名函数之后声明一些函数,并让命名的匿名函数在运行时找到另一个函数吗? 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);

3 个答案:

答案 0 :(得分:2)

该特定示例有效,因为永远不会调用myFunc2,因为永远不会调用myFunc

一般来说,JS范围,提升和时间的正常规则适用:

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

答案 1 :(得分:0)

(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(= undefined);被悬挂。然后作业保持在同一水平。

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

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

答案 2 :(得分:0)

让我们看看代码中究竟发生了什么。

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

2.你宣布一个功能。 (但还没有调用它)

3.将myFunc分配给window.foobar。

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

现在,这些步骤发生了:

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

  2. myFunc2已定义。

  3. window.foobar获取调用myFunc()的结果。 所以会发生什么,myFunc()返回调用myFunc2()的结果并将其结果附加到bar。

  4. 因此,window.foobar的值将是“foobar”。

    (不,这不是编译程序的工作原理)