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

Bar*_*rka 11 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>
Run Code Online (Sandbox Code Playgroud)

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

Sar*_*raz 27

它是自我调用匿名函数的简写或替代:

(function(){
  // code
})();
Run Code Online (Sandbox Code Playgroud)

可写:

!function(){
  // code
}();
Run Code Online (Sandbox Code Playgroud)

您也可以使用+而不是!.

如果您只是这样做:

function(){
  // code
}();
Run Code Online (Sandbox Code Playgroud)

这将产生问题,这就是为什么你需要!在它之前添加将函数声明转换为函数表达式的原因.

引用文档,第12.4节:

ExpressionStatement不能以function关键字开头,因为这可能使其与FunctionDeclaration不一致.

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


小智 6

他们否定结果,而不是函数本身:

!function( x ){ return x }( true );
!true
false
Run Code Online (Sandbox Code Playgroud)

实际上,它是以下形式的稍微压缩的形式:

(function(){}())
Run Code Online (Sandbox Code Playgroud)

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

function(){}()
Run Code Online (Sandbox Code Playgroud)

!但在开头添加 the会将其变成一个函数expression并使其工作。

  • @downeyt ‘!’ 没有两种含义。当 JS 运行时看到 `!` 时,它知道它只能表示(因为 `!` 只有一种含义)逻辑否定,因此,JS 运行时知道您只能否定表达式,而不是语句,因此指令的其余部分也被如此处理。在这种用法中,表达式的结果并不重要并且被丢弃。没有双重意义。 (4认同)