2012-02-13 91 views
8

对不起,发布这个,但功能是不可谷歌,我没有在我的JavaScript代码中找到它。Javascript中的功能是什么意思?

这是Twitter的是如何使用它:

<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://google.com" data-text="Google says">Tweet</a> 
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script> 

https://twitter.com/about/resources/buttons#

回答

21

这是self-invoking anonymous function速记或替代:

(function(){ 
    // code 
})(); 

可以写成:

!function(){ 
    // code 
}(); 

您还可以使用+而不是!

如果你压根儿:

function(){ 
    // code 
}(); 

这会产生问题,这就是为什么你需要添加!果然收到函数声明函数表达式

Quoting docs, section 12.4:

An ExpressionStatement cannot start with the function keyword because that might make it ambiguous with a FunctionDeclaration.

为了更好地理解这个概念,你应该检查出:

+0

有趣。什么时候自我调用匿名函数有用?与简单执行里面的语句有什么不同? – netvope 2012-06-26 04:26:06

+1

@netvope:看到http://stackoverflow.com/questions/592396/what-is-the-purpose-of-a-self-executing-function-in-javascript – Sarfraz 2012-06-26 06:06:45

+0

我明白了。谢谢。如果Javascript支持用大括号作为范围(如C++中的那样) – netvope 2012-06-27 07:15:00

2

他们否定的结果,而不是本身的功能:

!function(x){ return x }(true); 
!true 
false 

在现实中,这是一个稍微压缩的形式:

(function(){}()) 

因为它需要少一个字符。它需要的原因是你不能直接调用函数声明,例如这是无效的:

function(){}() 

,但在开始添加!把它变成一个功能expression并使其正常工作。

+0

有趣的技术... – 2012-02-13 20:12:22

+1

“否定结果”是误导,@ Twisol的答案更准确 – 2012-02-13 20:14:19

+0

@ŠimeVidas - 我有一种感觉,这是生成的代码寻找自调用函数模式,因为它确实保存1个字符:) – 2012-02-13 20:14:25

2

它通常用来解决在JavaScript语法一个怪癖。这给出了一个语法错误:

function() { 
}(); 

它理解为一个函数声明(如function foo() {}),而不是函数表达式。所以加入!在它之前或用圆括号包装它,迫使解析器理解它是一个表达式。

+0

这不是语法的怪癖。这只是语法。 – 2017-10-08 15:27:59

相关问题