【问题标题】:strange anonymous javascript function call [duplicate]奇怪的匿名javascript函数调用[重复]
【发布时间】:2013-04-16 17:20:00
【问题描述】:

我在看this 非常酷的 sn-p,我在 js 中遇到了这条奇怪的线 并删除阻止函数被调用的内容

!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
function(d, w){
   ...
}(document, window);

,我用 ( ) 包装了该函数,它按预期工作。

(function(d, w){
    ...
})(document, window);

所以我的问题是那条奇怪的线是什么,为什么它会起作用?我的狂野客人是它是某种 IIFE...

【问题讨论】:

  • 它不是 ! 运算符棘手.. !
  • 详细说明副本:+-! 都是一元运算符,与链接副本中的单独 ! 执行相同的操作。
  • @apsillers 所以这些重复是不必要的?
  • @MimiEAM 正确,只需一个+-! 即可将函数解析为函数表达式(而不是函数声明)。

标签: javascript


【解决方案1】:

你是对的,它是Immediately-Invoked Function Expression (IIFE)

你可以重写

!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
function(d, w){
   ...
}(document, window);

!function() {
    ...
}()

它仍然有效。这是因为! 是一元运算符(就像+-~——参见https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Expressions_and_Operators)。 在一元运算符之后需要一个表达式(并评估!)。表达式可以是函数调用。

然而

!function() {
    ...
}()

只是另一个表达式,所以你可以在它前面放一个一元运算符:

+!function() {
    ...
}()

您可以根据需要继续此模式。

注意:以这种方式调用匿名函数,会忽略函数的返回值。因此,如果您对返回值不感兴趣,请仅使用它。

编辑:添加了对 Daff 在回答中提到的 http://benalman.com/news/2010/11/immediately-invoked-function-expression/ 的出色参考。

【讨论】:

  • 感谢您的澄清 :)
【解决方案2】:

诀窍实际上是那里的单个 ! 运算符(整个第一行实际上做同样的事情)。这同样适用:

!function(d, w){
   ...
}(document, window);

一如既往,我可以在 Immediately-Invoked Function Expressions 上推荐 Ben Almans 的精彩文章

【讨论】:

  • 谢谢,我希望我能接受这两个答案
猜你喜欢
  • 2012-02-23
  • 1970-01-01
  • 2013-08-29
  • 2013-11-22
  • 1970-01-01
  • 2014-09-11
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多