2

Javascript 自执行函数是否像编译程序一样工作。即,您可以在自执行函数中的命名匿名函数之后声明某个函数,并让命名匿名函数在运行时定位另一个函数吗?即为什么以下工作?

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

(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);
4

3 回答 3

2

该特定示例之所以有效,myFunc2是因为从未调用过,因为myFunc从未调用过。

不过,一般来说,适用于 JS 范围、提升和计时的正常规则:

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

于 2013-08-21T12:34:52.160 回答
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 说了其余的内容:必须在使用变量之前填充变量,而不是在定义调用时将使用它的函数之前填充。

于 2013-08-21T13:02:54.387 回答
0

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

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

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

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

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

现在,这些步骤发生了:

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

  2. myFunc2 被定义。

  3. window.foobar 得到调用 myFunc() 的结果。所以发生的事情是,myFunc()返回调用 myFunc2()的结果并将其结果附加到 bar。

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

(不,这不是编译程序的工作方式)

于 2013-08-21T13:05:52.633 回答