很抱歉发布这个但是!功能不是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>
答案 0 :(得分:27)
它是self-invoking anonymous function的简写或替代:
(function(){
// code
})();
可写:
!function(){
// code
}();
您也可以使用+
代替!
。
如果您只是这样做:
function(){
// code
}();
这会产生问题,这就是为什么你需要在它之前添加!
,将 函数声明 转换为 函数表达式< / EM> 强>
ExpressionStatement不能以function关键字开头,因为 这可能会使FunctionDeclaration模糊不清。
为了更好地理解这个概念,你应该看看:
答案 1 :(得分:2)
他们否定了结果,而不是功能本身:
!function( x ){ return x }( true );
!true
false
实际上,它是一种略微压缩的形式:
(function(){}())
因为它需要少1个字符。它需要的原因是你不能直接调用函数声明,例如这是无效的:
function(){}()
但在开头添加!
会将其转换为函数expression
并使其正常工作。
答案 2 :(得分:2)
它通常用于解决JavaScript语法中的怪癖。这会产生语法错误:
function() {
}();
它被读作函数声明(如function foo () {}
),而不是函数表达式。所以加入!在它之前,或将它包装在括号中,迫使解析器理解它是一个表达式。