我看到一些JavaScript文件设置下拉菜单等等,它们包含在(function() { ... })
中的所有内容。我想知道这有什么不同于他们没有包装在匿名函数中。例如,
$('#someElement').click(alert("Hi!"));
在JS文件中,与
不同(function() {
$('#someElement').click(alert("Hi!"));
});
???
答案 0 :(得分:3)
首先:我认为您忘记了参数-paranthesis (function(){})()
- 最后()
- s。否则这没有任何意义,因为没有执行的匿名函数定义是没有意义的。
(function(){})()
是一个匿名函数,可以立即执行。这为函数定义中的所有内容定义了一个匿名上下文(或命名空间)。
这样做的好处是,内部定义的函数和变量不会使全局命名空间混乱。 insinde定义的所有内容也可以完全访问内部的所有变量,同时隐藏在外部。具有此功能的构造称为闭包,这就是为什么此构造也称为“匿名闭包”。
答案 1 :(得分:1)
正如其他人提到的那样,你可能会把它与这种常见语法混淆:
(function(){
// code here
}());
第一个和最后一个括号不会在此代码中执行任何操作,但人们会使用它来避免混淆。这是一个关闭。换句话说,它创建一个匿名函数并立即运行它,创建一个本地命名空间。在此函数中声明的任何变量将在之后停止存在。
函数声明语法是:
function nameGoesHere (parameters, go, here) { /* code goes here */}
写得像这样,几乎可以转化为:
nameGoesHere = new Function("parameters", "go", "here", "/* code goes here */");
唯一的区别是函数实例本身在使用function
关键字编写时也会跟踪其名称。
当你写(function(){/* code here */}());
时,你没有给这个函数命名,所以你真正做的就是:
(new Function(/* code here */)());
。让我们将返回的函数表示为单词" anonymous"。该行变为(anonymous());
,执行anonymous
函数。然后你会留下额外的parens,只有在那里才能让那些阅读代码的人明白这是从一开始就关闭的。
另一方面,如果你看到了:
$(function(){
// code here
});
调用jQuery添加的$函数,jQuery在页面完全加载时执行其中的代码。
答案 2 :(得分:0)
第二个例子定义了一个函数表达式,从不调用它。
它没有立即调用它(如果确实如此,它内部没有局部变量,所以它与第一个例子没有任何不同。)
它不会将它传递给另一个函数(例如jQuery美元函数 - $(function () { ... })
) - 作为回调。它不会将它分配到任何地方以便稍后调用。
因此,第二个例子什么都不做。
可能你有一些其他代码在源代码中读取包含那些语句并对其做了些什么,但如果是这样,你还没有分享足够的代码来看什么。