Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么/在哪里/什么时候我应该这样做?(将js代码封装在函数中,然后执行它)_Javascript_Design Patterns - Fatal编程技术网

Javascript 为什么/在哪里/什么时候我应该这样做?(将js代码封装在函数中,然后执行它)

Javascript 为什么/在哪里/什么时候我应该这样做?(将js代码封装在函数中,然后执行它),javascript,design-patterns,Javascript,Design Patterns,可能重复: 这是干什么用的 (function(){ //The code to be executed })(); 还有,这和闭包有什么关系吗 这是Javascript中的一个关键概念。Javascript没有“真正”的私有属性或字段——但使用闭包可以创建等价的属性或字段。它们是组织JS的非常重要的手段 本示例中的一个关键点是()在代码的最后——添加这些括号告诉Javascript立即执行代码——有效地初始化其中包含的任何内容 为了帮助澄清(我不是JS专家)——这个构造,即

可能重复:

这是干什么用的

(function(){
     //The code to be executed
})(); 
还有,这和闭包有什么关系吗

这是Javascript中的一个关键概念。Javascript没有“真正”的私有属性或字段——但使用闭包可以创建等价的属性或字段。它们是组织JS的非常重要的手段

本示例中的一个关键点是
()在代码的最后——添加这些括号告诉Javascript立即执行代码——有效地初始化其中包含的任何内容


为了帮助澄清(我不是JS专家)——这个构造,即使不是纯闭包,也经常与闭包一起出现。例如,下面的代码段(从上面的“我的链接”复制)使用此语法定义内部隐藏方法:

function callLater(paramA, paramB, paramC){
    /* Return a reference to an anonymous inner function created
       with a function expression:-
    */
    return (function(){
        /* This inner function is to be executed with - setTimeout
           - and when it is executed it can read, and act upon, the
           parameters passed to the outer function:-
        */
        paramA[paramB] = paramC;
    });
}

...

/* Call the function that will return a reference to the inner function
   object created in its execution context. Passing the parameters that
   the inner function will use when it is eventually executed as
   arguments to the outer function. The returned reference to the inner
   function object is assigned to a local variable:-
*/
var functRef = callLater(elStyle, "display", "none");
/* Call the setTimeout function, passing the reference to the inner
   function assigned to the - functRef - variable as the first argument:-
*/
hideMenu=setTimeout(functRef, 500);

尽管如此:此示例不会在内部函数定义之后立即执行(它缺少
();
)。因此,在本例中,封闭的函数将在稍后的时间点进行求值-
()
在函数语言中起着很大的作用。

它用于在全局范围外运行代码。 这样,您就可以使用函数作用域。在本例中,是匿名函数的作用域

例如,当您不想创建全局变量时,这非常有用

见:

再见


编辑:

语法
()
是调用函数的另一种方式。 看


见。

我最近经常看到它。我猜:

不需要命名函数。这意味着它不可重用。
这为您提供了一个使用
var
声明变量的局部范围(否则,您将把它们添加到全局范围)。

这是定义函数并立即调用它的一种方法。这就是最后一个例子;正如您所说,闭包是JavaScript中的一个关键概念。但本质上是保留或避免对属于访问变量的函数的执行上下文的变量的引用。这里的问题是没有任何变量,这毕竟不是问题的重点。我没有使任何变量在其原始上下文之外可访问。那么,这里有什么闭包?我投了反对票(“答案没用”)。如果你愿意,我可以把它取出来,但是你的答案与其他答案几乎没有共同之处。“没有任何变量”——示例中没有任何内容,我假设您正在检查的案例可能包含变量和其他函数之类的成员,这导致它充当闭包。这是我很少看到的简单脚本/过程性JavaScripts抱歉,STW,我不是有意粗鲁,但是,你看到其他的回答了吗?你可以争论一整天,但在这一点上,我问的似乎很清楚(给出了所有其他的回答),而你的答案就是不合适。事实上,这与我没有找到的另一个问题完全相同。无论如何,谢谢你的回答,但你的回答可能更适合回答另一个问题,也许是关于闭包的。另外,您的答案似乎与原来的答案相比有了很大的变化。感谢您对替代调用技术()的编辑。。。我似乎永远也找不到任何地方可以简单地说出来!
var b = 2;
(function(){
    var a=1;
    alert("a:" + a); // alerts 1
    alert("b:" + b); // alerts 2
})();
alert("OUT b:" + b); // alerts 2
alert("OUT a:" + a); // undefined
alert(1); // alerts 1
(alert)(2); // alerts 2