什么是这个?(function(){ })()

8

我认为那没有任何作用。不过,我可能是错的。 - Kevin Wang
同样的问题在这里,看我的回答 - Ibu
非常常见的问题。 - Orbling
3
你提供的两个例子只有一点“语法”上的区别,参考这个回答 - Christian C. Salvadó
8个回答

5

它们是一样的。

要使其成为有效的Javascript语法,必须在函数定义或函数调用周围加上括号,但使用哪种方式并不重要。

为了演示它的作用,使用命名函数如下:

function something() {}

// parenthesis around the function reference:
(something)();

// parenthesis around the function call:
(something());

+1. 这是唯一一个回答了 OP 所问问题的答案。 - Yahel

5

这声明了一个匿名函数并立即调用它。

这样做的好处是,函数内部使用的变量不会被添加到当前作用域中,也不会向当前作用域中添加函数名称。

需要注意的是,括号包围函数声明不是任意的。如果删除这些括号,将会出现错误。

最后,你实际上可以使用额外的括号将参数传递给匿名函数,例如:

(function (arg) {
   //do something with arg
})(1);

See http://jsfiddle.net/eb4d4/


除非我漏看了什么,第二个例子的语法是完全有效的。 - Yahel
2
你为什么认为他的第二个例子是无效的? - jAndy
顺便说一下,从IE6到最新的Chrome和Firefox都支持第二个版本,我已经多次看到它比第一个版本更推荐。你只需要确保整个函数调用在括号内;例如 (function(){ console.log('test'); }())。来自Crockford的网站:"当一个函数需要立即调用时,整个调用表达式应该被包裹在括号中,以便清楚地表明产生的值是函数的结果而不是函数本身。" - Lepidosteus

3

这是一个匿名函数,在 () 调用函数时立即执行,整个函数被包裹在 ( 和 ) 中。

( // arbitrary wrapping
(function() { // begin anon function

}) // end anon function
() // call the anon function
) // end arbitrary wrapping

2
第一个只是在函数外加上( ),这样它就能使用()立即调用该函数。
(function(){
    alert('Hi');
})();

警告:嗨,当

function(){
    alert('Hi');
}

由于您的功能从未被执行,因此它不起作用。


2
这周得了1600分?保罗做得很棒 :) - naveen
@yahelc,你知道的真多。我刚测试了一下,你说得对。我以前也尝试过这种方式,但似乎并没有成功,所以我一直以为不行... 可能当时我犯了其他错误,哈哈。我编辑一下我的帖子 :) - Paul
实际上,我认为我尝试的是没有任何括号的,例如function(){ //Code }(); - Paul
@PaulPro 取消了踩一下。感谢您的修复 :) - Yahel

1

这是一个立即调用的匿名函数。()) 不起作用,因为在使用 () 调用函数之前,你需要在函数周围加上 ()

有点类似于:

function a(){}
a();

2
它不是自调用的,而是一个匿名函数在创建后立即被调用。如果您想要创建自调用匿名函数,请阅读此博客文章:http://amix.dk/blog/post/19239 - Paul

1

这只是一个匿名函数。 () 括号立即调用该函数,而不是等待在其他地方被调用。


0

这是声明一个匿名函数并立即执行它。这在创建作用域变量时很常见。


0
在JavaScript中,函数定义是一个字面量 - 这意味着它是一个具有 Function 对象值的表达式。
如果你在它后面放置了 (),那么你就有效地在定义它之后调用该函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接