Javascript 一个普通的(函数(){…})到底是什么意思?
我看到一些设置下拉菜单的JavaScript文件,它们将所有内容都包装在Javascript 一个普通的(函数(){…})到底是什么意思?,javascript,Javascript,我看到一些设置下拉菜单的JavaScript文件,它们将所有内容都包装在(function(){…})中。我想知道这与不将它们包装在匿名函数中有什么不同。例如,它是怎样的 $('#someElement').click(alert("Hi!")); 在JS文件中,与 (function() { $('#someElement').click(alert("Hi!")); }); ?第二个示例定义了一个函数表达式,并且从不调用它 它不会立即调用它(如果调用了,那么它内部没有局部变量,因
(function(){…})
中。我想知道这与不将它们包装在匿名函数中有什么不同。例如,它是怎样的
$('#someElement').click(alert("Hi!"));
在JS文件中,与
(function() {
$('#someElement').click(alert("Hi!"));
});
?第二个示例定义了一个函数表达式,并且从不调用它 它不会立即调用它(如果调用了,那么它内部没有局部变量,因此与第一个示例没有任何不同) 它不会将其作为回调传递给另一个函数(例如jQuery美元函数-
$(函数(){…})
)。它不会将其分配到任何地方以便稍后调用
因此,第二个示例根本不起作用
您可能有其他一些代码读取包含这些语句的源代码并对其执行某些操作,但如果是这样,您还没有共享足够的代码来查看内容。首先:我认为您忘记了参数parantasis
(function(){})(
——最后一个()
-s。否则这就没有意义了,因为没有解释的匿名函数定义是没有意义的
(function(){})(
是一个立即执行的匿名函数。这为函数定义中的所有内容定义了匿名上下文(或命名空间)
这样做的好处是,内部定义的函数和变量不会使全局命名空间混乱。InInde中定义的所有内容还具有完全访问内部所有变量的好处,同时可以从外部隐藏。具有此功能的构造称为闭包,这就是为什么此构造也称为“匿名闭包”。您可能会将其与其他人提到的常见语法混淆:
(function(){
// code here
}());
第一个和最后一个括号在代码中没有任何作用,但人们使用它来避免混淆。结束了。换句话说,它创建一个匿名函数并立即运行,从而创建一个本地名称空间。在此函数中声明的任何变量都将在以后停止存在
函数声明语法为:函数名goesher(参数,go,here){/*code到here*/}
这样写,几乎可以翻译成:
namegoesher=新函数(“参数”、“转到”、“此处”、“代码转到此处”*/”代码>
唯一的区别是函数实例本身在使用function
关键字编写时也会跟踪其名称
当您编写(function(){/*code here*/}())时代码>,您没有为函数指定任何名称,因此您真正要做的就是:
(新函数(/*此处编码*/)())代码>。让我们将返回的函数表示为单词“匿名”。该行变为(匿名())
,它执行匿名
函数。然后你会得到额外的参数,这些参数只是为了让阅读代码的人明白,这从一开始就是一个结束
另一方面,如果您看到:
$(function(){
// code here
});
这将调用jQuery添加的$函数,该函数在页面完全加载时执行其中的代码。是否确定它不是,(function(){…})(
)?是否确定它不是$('#someElement')。单击(function(){alert(“Hi!”)
$('#someElement')。单击(alert(“Hi”)代码>对我来说没有多大意义。脚本运行后,将立即调用警报(“Hi!”)
,返回值将放入click()
函数中。然而,我认为alert()
不返回任何内容,click()
也需要一个函数表达式(handler)。下面是我所说的一个例子:@NotJohnSkeet我在该文件中没有看到(function(){…})
。您的意思是询问整个文件是否包装在$(function(){…})中代码>?从技术上讲,只有在引用(关闭)函数范围外的变量时才是闭包。@Basic:嗯。。。没错。所以:(函数($){…})(jQuery)
是一个闭包,而(function(){…})()代码>不是。我想这就是为什么术语“立即调用的函数表达式”更常见(在所有情况下都是正确的)。不管怎样,我也听说这个东西被称为“匿名闭包”。有趣的是,假设没有引用,我会选择“匿名函数”,可能前面加上“立即调用”(没有“表达式”),但我怀疑我是错的。无论如何,我不想影响你的回答,只是指出匿名函数!==关闭