关于javascript:声明函数里面()

Declaration function inside ( )

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What advantages does using (function(window, document, undefined) { … })(window, document) confer?
Advanced Javascript: Why is this function wrapped in parentheses?

我刚刚检查了如何编写jquery,然后在第一行我看到了这个:

1
2
3
(function( window, undefined ) {

});

我的问题是函数声明在()中的含义或原因是什么?


在你的例子中,我认为没有理由括号。

对于立即调用的函数,Douglas Crockford建议并提供如下代码示例。来源是http://javascript.crockford.com/code.html

When a function is to be invoked immediately, the entire invocation
expression should be wrapped in parens so that it is clear that the
value being produced is the result of the function and not the
function itself.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var collection = (function () {
    var keys = [], values = [];

    return {
        get: function (key) {
            var at = keys.indexOf(key);
            if (at >= 0) {
                return values[at];
            }
        },
        set: function (key, value) {
            var at = keys.indexOf(key);
            if (at < 0) {
                at = keys.length;
            }
            keys[at] = key;
            values[at] = value;
        },
        remove: function (key) {
            var at = keys.indexOf(key);
            if (at >= 0) {
                keys.splice(at, 1);
                values.splice(at, 1);
            }
        }
    };
}());

实际上,第一行是这样的:

1
2
3
(function( window, undefined ) {

})( window );

这是一个立即调用的函数表达式。


见:http://www.ecma-international.org/ecma-262/5.1/#sec-12.4

这只是ECMAScript(以及JavaScript)语法的一部分。

你需要parens立即调用匿名函数。

function () {}()会导致语法错误。但是,这些都可以工作:

1
2
(function () {}())
(function () {})()

重点是包装所有函数的内容,以便外部变量不会泄漏到函数中(反之亦然)。它是匿名的,因此也没有添加全局函数声明。


你键入错了,它可能是写的:

1
2
3
4
5
(function(...) {

    // script

})(...);

它用于避免冲突。这是一个自我调用的功能。由于最后的括号,它会调用自己。

此函数中定义的所有变量,对象和函数都保留在此函数中。


由于SLaks已经链接,它是一个自动执行功能。
对于内部的2个参数是另一个原因,性能和安全性。

表现明智,javascript会调查自己的变量,否则他会检查他的父母等等。
你可以想象,局部变量总是最快的。

对于未定义的部分,这是一个示例:
黑客可以说;

undefined = null;

现在你的代码失败了,会有bug和东西。

我希望这有用。