2011-10-14 172 views
1

可能重复:
What does this mean? (function (x,y)){…}){a,b); in JavaScriptJavaScript语法解释

请任何人解释,并提供有关下面的JavaScript示例,我找不到这个解释的任何文件:

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

    //javascript code here 

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

我在问这个问题,因为我在Google上也看到了javascript javascript cod e,他们大多数使用这种语法。

+1

搜索javascript关闭。 http://blog.morrisjohns.com/javascript_closures_for_dummies – jantimon

+0

哦,好的,我会尝试,谢谢ghommey :) –

+3

我怀疑搜索关闭会有很大的帮助。该模式称为[立即调用函数表达式](http://www.google.com.au/search?client=safari&rls=zh-CN&q=immediately+invoked+function+expression&ie=UTF-8&oe=UTF-8&redir_esc=&ei= ZO-XTpzvO9CXiQe60aWsAg)一些。其他人有类似的名字。它可以用来创建闭包,但没有必要创建闭包,也不是唯一的方法。 – RobG

回答

3

发生了什么事时,一个匿名函数表达式定义(括号内) -

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

    //javascript code here 

}) 

该函数然后使用()末马上打电话的功能,就像你所说的正常功能var result = someFunction()一样。因此,举例来说 -

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

您也可以将参数传递给anoymous功能,通过括号 -

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

+1 - 速度是准确性的敌人。 :-) – RobG

+0

@RobG - 谢谢!不知道我可以责怪所有的速度,但:) – ipr101

4

它是匿名功能调用

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

它是一样的

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

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

+1为正确。 :-) – RobG

1

功能圆括号与由STR的定义ARGS称为一次。

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

str变量可以是全局变量(例如jQuery),并且可以通过其相应的参数(例如,jQuery - > $)为该函数的唯一用途赋予别名。

一般来说,这是一种很好,安全的javascript写法,

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

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

+0

包含该功能的圆括号是**不**范围操作符。他们在那里允许立即调用该函数。如果他们不在那里,会出现语法错误。 – Matt

+0

啊,好点 - 谢谢。虽然,我认为这个函数不能被外部调用(因为它是匿名的)仍然是正确的。 – tomtom

1
(function(a, b) { 
    var x; 
}) 

返回一个匿名函数。由于技术/历史原因,匿名函数必须包含在括号内。

值得注意的是,名称a,bx对外部代码不可见。相反,只需编写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); 

是不使这些变量(或任何变量名)与世界其他地区可见的执行与变量的代码的最佳方式。

+0

您帖子顶部的表达式是一个没有名字的函数声明,所以它是一个语法错误。给定一个名称使其在语法上合法,它没有返回语句,因此返回'undefined',而不是函数。 – RobG

+0

@RobG谢谢。修正:括号括起来使其在语法上合法,它确实返回一个函数。请注意,匿名函数不需要用表达式中的括号包装,只能用语句包装。 – phihag