什么!Javascript中的函数是什么意思?

时间:2012-02-13 20:09:31

标签: javascript

很抱歉发布这个但是!功能不是google-able,我在我的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#

3 个答案:

答案 0 :(得分:27)

它是self-invoking anonymous function的简写或替代:

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

可写:

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

您也可以使用+代替!

如果您只是这样做:

function(){
  // code
}();

这会产生问题,这就是为什么你需要在它之前添加!,将 函数声明 转换为 函数表达式< / EM>

Quoting docs, section 12.4:

  

ExpressionStatement不能以function关键字开头,因为   这可能会使FunctionDeclaration模糊不清。

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

答案 1 :(得分:2)

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

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

实际上,它是一种略微压缩的形式:

(function(){}())

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

function(){}()

但在开头添加!会将其转换为函数expression并使其正常工作。

答案 2 :(得分:2)

它通常用于解决JavaScript语法中的怪癖。这会产生语法错误:

function() {
}();

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