Javascript 中的 !function 是啥意思? [复制]
Posted
技术标签:
【中文标题】Javascript 中的 !function 是啥意思? [复制]【英文标题】:what does !function in Javascript mean? [duplicate]Javascript 中的 !function 是什么意思? [复制] 【发布时间】:2012-03-05 06:06:22 【问题描述】:很抱歉发布此内容,但 !function 无法通过 Google 搜索,而且我在我的 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#
【问题讨论】:
【参考方案1】:他们否定结果,而不是函数本身:
!function( x ) return x ( true );
!true
false
实际上,它是一种略微压缩的形式:
(function()())
因为它需要少 1 个字符。需要它的原因是您不能直接调用函数声明,例如这是无效的:
function()()
但在开头添加 !
会将其变为函数 expression
并使其工作。
【讨论】:
有趣的技术... “否定结果”具有误导性,@Twisol 的回答更准确 @ŠimeVidas -- 我感觉这是生成的代码,用于寻找自调用函数模式,因为它确实节省了 1 个字符 :) @Jonz -- 是的,它会在扔掉它之前对其进行评估,而不是像一个昂贵的操作。它还可以防止代码中的错误基本上计算为:(function())()(function())()
——中间缺少;
意味着第二个函数被传递给第一个函数的结果。通常不需要的行为会导致错误或非常奇怪的行为。 !
或任何二进制操作都可以防止这种情况发生
@downeyt !
没有两个含义。当 JS 运行时看到 !
时,它知道它只能表示(因为 !
只有一个含义)逻辑否定,因此,JS 运行时明白你只能否定一个表达式,而不是一个语句,所以指令的其余部分被视为这样。在这种用法中,表达式的结果无关紧要并被丢弃。没有双重含义。【参考方案2】:
它是self-invoking anonymous function的简写或替代:
(function()
// code
)();
可以写成:
!function()
// code
();
您也可以使用+
代替!
。
如果你只是这样做:
function()
// code
();
这会产生问题,这就是为什么你需要在它之前添加!
,这会将函数声明变成函数表达式。
Quoting docs, section 12.4:
ExpressionStatement 不能以 function 关键字开头,因为 这可能会使 FunctionDeclaration 变得模棱两可。
为了更好地理解这个概念,您应该查看:
Function Declarations vs. Function Expressions【讨论】:
有趣。自调用匿名函数何时有用?和简单的执行里面的语句有什么区别? @netvope:见***.com/questions/592396/… 我明白了。谢谢。如果 Javascript 支持仅使用大括号(如在 C++ 中)进行作用域,那就太好了 @netvope ECMAScript 6(又名 ES 2015)确实支持带有let
和 const
声明的块级范围。【参考方案3】:
它通常用于解决 JavaScript 语法中的一个怪癖。这给出了一个语法错误:
function()
();
它被读作函数声明(如function foo ()
),而不是函数表达式。所以添加!在它之前,或者用括号括起来,强制解析器理解它是一个表达式。
【讨论】:
这不是语法的怪癖。这只是语法。以上是关于Javascript 中的 !function 是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Javascript 中的 !function 是啥意思? [复制]
javascript中的立即执行函数(function(){…})()
将整个 Javascript 文件包装在像“(function() ... )()”这样的匿名函数中的目的是啥?