Javascript - what does this line mean? !function ( $ )
Javascript:这行是什么意思?
-
什么都没有,没有上下文。 这不是一个独立的表达。 向我们展示剩下的!
-
你能给出一些上下文,比如它来自文件的链接,或者至少是上面和下面的几行?
-
这意味着缺少代码。
-
它看起来像是一个不会返回值的自执行函数的开头。
我敢打赌,稍微更完整的版本看起来像这样:
1 2 3
| !function ( $ ) {
// some code
}(jQuery); |
基本上,上面使用!运算符将匿名函数解释为函数表达式,然后可以立即调用它。带走!,你有一个无效的函数声明(或函数声明,取决于你喜欢的术语) - 无效,因为它没有名字。更常见的方法是将它放在括号中:
1 2 3
| (function ( $ ) {
// some code
})(jQuery); |
但有些人喜欢使用!而不是括号来保存角色。
您可以使用这样的代码的一个原因是您可以创建一些不会在全局范围内结束的工作变量。或者,从匿名函数中,创建一个在全局范围内但具有可以访问匿名函数范围中的私有变量的方法的对象。
关于$参数,我只是猜测jQuery将作为参数传递给函数,因为这在使用参数name $时很常见。您可能这样做的一个原因是,您可以使用另一个库来定义$,同时使用jQuery,但在此块中使用$进行jQuery。
我想我们错过了一些数据,但我认为这篇文章来自条件语句或三元组中的闭包。
1 2 3 4 5
| var test = 'Testing!';
(!function ( $ ) {
alert($);
return false;
}(test) ? alert("bad") : alert("good")); |
http://jsfiddle.net/MattLo/WpqfN/3/
-
那不是关闭。
-
@Havvy:当然可以。所有函数都在JS中创建闭包。
-
Matt Lo:你对IIFE肯定是正确的,但!更有可能被用来代替()来强制将函数作为表达式的一部分进行求值。看到这个问题。因此函数的返回结果可能会被忽略。
-
有趣的是,男人这个愚蠢的问题肯定让很多人的大脑感动不已。
-
@am not i am除了根本没有关闭任何值,并且该函数在初始执行后不可调用。
-
@Havvy:$位于局部变量环境中,封闭环境的变量环境绑定到当前词法环境的环境记录。如果未引用该函数,则无关紧要,因此无法再次调用。虽然短暂存在,但封闭确实存在。
-
......我知道这与SO上的一些高度评价的答案形成鲜明对比。像这个
-
@amnotiam - 但是,这个答案似乎使用术语"闭包",就好像它是"立即执行的匿名函数"的同义词,这是不正确的(虽然这两者在SO上常见的混淆)。
-
@nnnnnn:我明白你在说什么。这个措辞听起来并不像它,但是这个例子可能暗示"闭合"特别是IIFE,而事实并非如此。不确定是什么意思。但是你是对的,人们确实似乎使用"封闭",好像它将IIFE与其他功能区分开来。
-
@Havvy So让我们了解标准。关闭必须可重复使用?
-
@MattLo:Havvy这么认为,但我没有。通过关闭可以实现词汇范围。在JavaScript中,每个函数都可以访问其封闭的变量环境。
-
好的,是时候问它了,因为我知道这两点,但只是让它模棱两可
-
该函数也没有使用词法范围。它可以放在任何地方,只要它被赋予相同的输入,它将提供相同的输出。
-
@amnotiam:我同意你的最后评论;函数确实可以访问其父作用域的变量。但是我们可以整晚在这里争论内部函数是否实际上在它离开它的自然范围(例如通过返回)时,或者更确切地说,一旦它被创建,就会关闭(因此是一个闭包)那些变量。这个答案中的函数是无状态的,所以从技术上讲它不需要关闭任何东西(尽管实现可能会自动使它成为一个闭包)。在这一点上,闭包的定义变得难以确定并且可以解释。
-
@Cameron:我建议一个不需要,因此不需要引用其封闭变量环境的函数是一个优化实现的问题。我当然不怀疑现代实现在可能的情况下优化这些东西。但这真的是IMO的另一个问题。
-
@Havvy:词汇范围是语言的一部分,无论特定功能是否由它构成,或者特定的实现可以优化其中的一部分。