JavaScript命名函数自动调用

JavaScript命名函数自动调用,javascript,function,Javascript,Function,如何自动调用命名函数,以便以后也可以调用它 您可以通过执行以下操作自动调用匿名函数: (function(){ console.log('called') })(); 但如果你这样做了 (function f(){ console.log('called') })(); 您不能在代码后面使用f() 或者这个(抛出错误) 我知道您可以声明f,然后简单地调用f(),但是您可以在声明之后立即调用它吗?尝试以下操作: (function() { var f = window.f =

如何自动调用命名函数,以便以后也可以调用它

您可以通过执行以下操作自动调用匿名函数:

(function(){
  console.log('called')
})();
但如果你这样做了

(function f(){
  console.log('called')
})();
您不能在代码后面使用
f()

或者这个(抛出错误)

我知道您可以声明
f
,然后简单地调用
f()
,但是您可以在声明之后立即调用它吗?

尝试以下操作:

(function() {
    var f = window.f = function() { // defining f variable like inside a closure but also as a global to be invoked from everywhere
        console.log("SOMETHING");
    };

    f(); // funciton will be invoked
})();

f(); // function will be invoked as well

尝试以下操作:

(function() {
    var f = window.f = function() { // defining f variable like inside a closure but also as a global to be invoked from everywhere
        console.log("SOMETHING");
    };

    f(); // funciton will be invoked
})();

f(); // function will be invoked as well

不太清楚您在这里想要实现什么,但是:

var f = (function (){
    function f() {
        console.log('called');
    }
    f();
    return f;
})();

f();

您可以在闭包内定义
f
并调用它,然后返回它并将其分配给变量,以便以后可以再次使用它

我并不是说这是一个好的模式,而是在不了解您试图解决的具体问题的情况下

这样做似乎简单得多:

function f() {
    console.log('called');
}

(function() {
    f();    // calls f immediately
})();

// and later on:
f();
另一个编辑:好的,这里有一个非常可怕的解决方案,如果不是在严格模式下也可以工作(这是不使用它的充分理由):


这是第一个解决方案的一个略为紧凑的版本。

不太清楚您在这里想要实现什么,但是:

var f = (function (){
    function f() {
        console.log('called');
    }
    f();
    return f;
})();

f();

您可以在闭包内定义
f
并调用它,然后返回它并将其分配给变量,以便以后可以再次使用它

我并不是说这是一个好的模式,而是在不了解您试图解决的具体问题的情况下

这样做似乎简单得多:

function f() {
    console.log('called');
}

(function() {
    f();    // calls f immediately
})();

// and later on:
f();
另一个编辑:好的,这里有一个非常可怕的解决方案,如果不是在严格模式下也可以工作(这是不使用它的充分理由):


这是第一个解决方案的一个稍微紧凑的版本。

根据您的需要: 首先,你肯定应该使用你的第三个命题,它更清晰,更重要的是:它不会在不需要的时候创建一个闭包

无论如何,如果您想要执行一个函数并命名它,您应该将它注册到您当前的作用域(默认的是窗口对象)

以下是一个例子:

(window.myFunction = function(){
    alert("myFunction called")
})(); //triggers the function

window.myFunction() ; //triggers the function
myFunction() ; //triggers the function as well

根据您的需要: 首先,你肯定应该使用你的第三个命题,它更清晰,更重要的是:它不会在不需要的时候创建一个闭包

无论如何,如果您想要执行一个函数并命名它,您应该将它注册到您当前的作用域(默认的是窗口对象)

以下是一个例子:

(window.myFunction = function(){
    alert("myFunction called")
})(); //triggers the function

window.myFunction() ; //triggers the function
myFunction() ; //triggers the function as well


这样做没有意义。如果你把它封闭起来,那么它会把它隐藏起来。如果要访问它,请创建一个闭包,并将函数和调用放在其中。(function(){var f=function(){console.log('foo');};f();})(;/)你能得到的最好的为什么没有意义?我想为一个javascript游戏声明一个
draw
函数(游戏循环),它是一个递归函数(用requestAnimFrame调用自己),我必须第一次调用它(为了进入递归)。为了清楚起见,我知道这可以很容易地完成,就像我在上一个示例中所做的一样,但是我只是想知道你是否可以像匿名函数那样自动调用一个命名函数。这没有意义,因为闭包被用来限制对函数的访问。正如我所说,把它们都放在下面的答案中,这样做没有意义。如果你把它封闭起来,那么它会把它隐藏起来。如果要访问它,请创建一个闭包,并将函数和调用放在其中。(function(){var f=function(){console.log('foo');};f();})(;/)你能得到的最好的为什么没有意义?我想为一个javascript游戏声明一个
draw
函数(游戏循环),它是一个递归函数(用requestAnimFrame调用自己),我必须第一次调用它(为了进入递归)。为了清楚起见,我知道这可以很容易地完成,就像我在上一个示例中所做的一样,但是我只是想知道你是否可以像匿名函数那样自动调用一个命名函数。这没有意义,因为闭包被用来限制对函数的访问。正如我所说,把它们都放在一个闭包中,如下面的答案所示。f的定义不会超出闭包的范围。(啊,有个办法)@Gauthier,你可以试试这个主意,我想少编代码,而不是多编:)。我只想做
函数f(){console.log('called')}()。为什么这不起作用?@Cristy如果你想让它在全局环境中起作用,不要在closure中定义它,它不在closure中。但它不起作用:
SyntaxError:Unexpected token)
f不会在闭包范围之外定义。(啊,有个办法)@Gauthier,你可以试试这个主意,我想少编代码,而不是多编:)。我只想做
函数f(){console.log('called')}()。为什么这不起作用?@Cristy如果你想让它在全局环境中起作用,不要在closure中定义它,它不在closure中。但它不起作用:
SyntaxError:Unexpected-token)
我的想法是希望代码更少,而不是更多:)。我只想做
函数f(){console.log('called')}()。为什么这个不行?@Cristy:因为函数表达式不是这样工作的。这只是几行额外的内容。我会避开第一个示例,坚持使用更可取的第二个示例,在不同的范围内拥有一个变量的多个实例是非常困难的。@mackiee:绝对同意。至少我不会让变量与闭包中的函数命名相同。这只是让人困惑。我的想法是,我希望代码更少,而不是更多:)。我只想做
函数f(){console.log('called')}()。为什么这个不行?@Cristy:因为函数表达式不是这样工作的。这只是几个额外的行。我会远离第一个例子&