在javascript中,什么时候你想使用这个:

(function(){
    //Bunch of code...
})();

在这:

//Bunch of code...

当前回答

你可以使用这个函数返回值:

var Test = (function (){ const alternative = function(){ return 'Error Get Function '}, methods = { GetName: alternative, GetAge:alternative } // If the condition is not met, the default text will be returned // replace to 55 < 44 if( 55 > 44){ // Function one methods.GetName = function (name) { return name; }; // Function Two methods.GetAge = function (age) { return age; }; } return methods; }()); // Call console.log( Test.GetName("Yehia") ); console.log( Test.GetAge(66) );

其他回答

由于Javascript中的函数是一等对象,通过这样定义它,它有效地定义了一个类似于c++或c#的“类”。

该函数可以定义局部变量,并在其中包含函数。内部函数(实际上是实例方法)可以访问局部变量(实际上是实例变量),但它们将与脚本的其余部分隔离。

(function(){
    var foo = {
        name: 'bob'
    };
    console.log(foo.name); // bob
})();
console.log(foo.name); // Reference error

实际上,上面的函数将被视为没有名称的函数表达式。

用左右圆括号包装函数的主要目的是避免污染全局空间。

函数表达式中的变量和函数变成私有的(也就是说,它们在函数外部是不可用的)。

可能是范围隔离。这样函数声明中的变量就不会污染外部命名空间。

当然,在一半的JS实现中,它们都是如此。

自我调用(也称为 自动调用)是当一个函数 立即执行 定义。这是一个核心模式 它是许多人的基础 JavaScript的其他模式 发展。

我是它的超级粉丝:)因为:

它使代码减至最少 它实现了行为与表示的分离 它提供了一个闭包,可以防止命名冲突

(为什么你要说它是好的?)

它是关于一次定义和执行一个函数。 你可以让这个自动执行的函数返回一个值,并将该函数作为参数传递给另一个函数。 它有利于封装。 它也适用于块作用域。 是的,你可以把你所有的.js文件封装在一个自动执行的函数中,并且可以防止全局命名空间污染。;)

更多的在这里。

这都是关于变量作用域的。默认情况下,在自执行函数中声明的变量仅可用于自执行函数中的代码。这允许编写代码时不考虑变量在其他JavaScript代码块中的命名方式。

例如,正如Alexander在评论中提到的:

(函数(){ Var foo = 3; console.log (foo); }) (); console.log (foo);

这将首先记录3,然后在下一个console.log上抛出一个错误,因为foo没有定义。