【问题标题】:javascript syntax explanation [duplicate]javascript语法解释[重复]
【发布时间】:2011-10-14 08:05:10
【问题描述】:

可能重复:
What does this mean? (function (x,y)){…}){a,b); in JavaScript

请任何人解释并举例说明下面的 Javascript,我找不到任何解释这个的文档:

(function([arg, arg ...]) {

    //javascript code here

})([str, str ...]);

我问这个问题是因为我在 Google 中也看到了 Facebook javascript 代码,其中大多数都使用这种语法。

【问题讨论】:

标签: javascript


【解决方案1】:

是匿名函数调用

参数值str, str作为参数arg, arg传递给函数,然后执行javascript代码。

和这个一样

function foo([arg, arg ...]) {
    //javascript code here
}

foo([str, str, ...]);

【讨论】:

  • +1 表示大部分正确。 :-)
【解决方案2】:

发生的事情是,定义了一个匿名函数表达式(在括号中)-

(function([arg, arg ...]) {

    //javascript code here

})

然后在函数末尾使用() 立即调用该函数,就像调用普通函数var result = someFunction() 一样。所以,例如 -

(function() {
    alert('Called by "()" at end of function');
})()

您还可以通过括号将参数传递给匿名函数 -

(function(username) {
    alert('Called by "()" at end of function. Hello ' + username + '!');
})('Dave')

【讨论】:

  • +1 - 速度是准确性的敌人。 :-)
  • @RobG - 谢谢!不知道我可以把这一切都归咎于速度:)
【解决方案3】:
(function(a, b) {
  var x;
})

返回一个匿名函数。出于技术/历史原因,匿名函数必须用括号括起来。

值得注意的是,名称abx 对外部代码不可见。相反,只写var x; 会使x 可访问,从而污染全局命名空间。这相当于经典面向对象语言中的私有变量。

我们也可以这样写:

var func = function(a, b) {var x;};
// or equivalently:
function foo(a, b) {var x;};

func('arg1', 2);

但这会再次污染全局命名空间,因为它使函数func 对其他人可见。由于我们不想多次致电func

(function(a, b) {var x;}) ('arg1', 2);

是使用变量执行代码而不使这些变量(或任何变量名称)对世界其他地方可见的完美方式。

【讨论】:

  • 您帖子顶部的表达式是一个没有名称的函数声明,因此是语法错误。给定一个名称以使其在语法上合法,它没有返回语句,因此返回undefined,而不是函数。
  • @RobG 谢谢。固定:用括号括起来使其在语法上合法,它确实返回一个函数。请注意,匿名函数不需要在表达式中用括号括起来,只在语句中。
【解决方案4】:

圆括号中的函数只调用一次,参数由 strs 定义。

包含函数的圆括号用于限制函数的范围,即该函数不能被外部调用。

str 变量可以是全局变量(例如 jQuery),并且可以通过其对应的 arg(例如 jQuery -> $)作为别名,以供函数单独使用。

一般来说,这是编写 javascript 的一种很好、安全的方式,例如

(function($) {
   // code
})(jQuery)

对于函数,局部变量“$”表示全局变量“jQuery”。这意味着您可以将“$”定义为另一个脚本(或函数)中的其他内容,并且该变量不会影响此函数中的“$”。

【讨论】:

  • 包含函数的圆括号是 not 范围运算符。它们在那里允许立即调用该函数。如果它们不存在,则会发生语法错误。
  • 啊,好点 - 谢谢。虽然,我的观点是该函数不能被外部调用(因为它是匿名的)仍然是正确的。
猜你喜欢
  • 2018-06-29
  • 2017-03-12
  • 2013-10-19
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 2018-05-16
相关资源
最近更新 更多