【问题标题】:Any difference between f() and (f())?f() 和 (f()) 有什么区别?
【发布时间】:2013-06-27 01:02:44
【问题描述】:

有什么区别

var myfunc = (function () { return function () { ... } }());

var myfunc = function () { return function () { ... } }();

这只是样式问题还是第一种形式的 () 周围有更多问题?

【问题讨论】:

  • 一个有更多的括号,显然。
  • 这是一个风格决定。 Crockford justifies using parenthesis with "当要立即调用一个函数时,整个调用表达式应该用括号括起来,这样就可以清楚地看出生成的值是函数的结果,而不是函数本身。"。在这一点上,我个人同意他的看法。
  • 稍微相关(Crockford 谈括号定位):youtube.com/watch?v=eGArABpLy0k

标签: javascript


【解决方案1】:

不。或者至少在你的例子中没有。

仅当函数关键字是语句中的第一个标记时,外部括号才有意义。

// cool
var foo = function(){}();
var foo = (function(){}());

// also cool
(function(){}());

// not cool, syntax error
// parsed as function statement, expects function name which is missing
function(){}();

// also not cool, syntax error
// declares a function, but can't be executed immediately
function foo(){}();

function 是语句中的第一个标记时,它是一个函数声明(想想命名 函数),它在所有其他上下文中的行为与function 略有不同。前导括号强制解析器将其视为函数表达式(想想 anonymous 函数),从而允许立即执行。

见:What is the difference between a function expression vs declaration in JavaScript?

如果您以其他内容(例如变量声明)开始行或语句,从技术上讲,这根本不重要。

【讨论】:

  • 你不是说每个函数表达式都是匿名函数吧?
  • @FelixKling 足够接近。这里有很多深度和微妙之处。我的回答并没有全部探讨。我只是说 fn 表达式在本质上比 fn 声明更接近“匿名”。让我们为不同的问题解释命名函数表达式和未命名函数表达式之间的区别。
  • @FelixKling - 这就是 Ben Alman 如此痴迷于打电话给他们IIFEs 的部分原因。
【解决方案2】:

没有区别,尽管 Crockford 建议使用前者来确定它被视为函数表达式。

有关更多信息,请阅读以下内容:

【讨论】:

  • 谢谢!这就是我在他的 JavaScript: The Good Parts 一书中看到它使用的地方。我以为我错过了什么。我想它更具可读性,您不会很快假设将“第一个”函数分配给变量。
【解决方案3】:

技术上没有区别,它只是一种惯用风格,用于提高可读性,一开始就表明它是一个自调用函数。

【讨论】:

    【解决方案4】:

    没有区别,只是风格问题。两者都是执行函数,它们返回变量中返回的任何内容,并且返回一个函数。 check this out

    【讨论】:

      【解决方案5】:

      目的是为了避免全局作用域,在(function (){ return function(){}}()); 前面添加var myfunc = 实质上就达不到目的

      比较两者

      (function(){...do something...}());
      

      此函数在括号内的局部范围内运行。

      var myfunc = function(){};
      

      此函数在全局范围内运行。 为什么不这样,因为您可能会与其他方法和var 以及名为var 的插件发生命名冲突,并且由于var 保存在全局范围内,它可能会阻碍您的应用程序性能。

      我喜欢

      (function() {})();
      

      【讨论】:

      • “这个函数在本地范围内运行,在括号内。” 我认为你在这里混淆了一些东西。括号不会创建范围,只有函数可以。立即调用的函数表达式 (IIFE) 用于创建局部作用域并在函数执行的作用域中“隐藏”变量。但可以假定 (function(){...do something...}());var myfunc = function(){}; 两个语句在同一作用域中运行。或者我没有正确理解你的答案。
      • 那么在(); 中初始化的任何变量都会运行然后被gc 删除,如果varvar myfunc() 之外声明,它会运行并存储在全球范围。您的权利,它们都在全局范围内运行,不同之处在于一个在运行后存储,另一个被 gc 删除
      • 这听起来比答案中写的更正确。尽管您无法在 (); 中初始化变量。括号返回一个值,你要么把它保存在一个变量中。
      猜你喜欢
      • 2012-04-14
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 2013-02-09
      • 2017-08-18
      相关资源
      最近更新 更多