在函数代码段中理解这个javascript jquery函数

时间:2012-01-21 22:03:22

标签: javascript jquery

这部分是一个jquery问题,但大多数是javascript。我只是不太了解javascript以理解这段代码:

1 (function () {
2            $(function () {
3                //Global ajax progress dialog box
4                //Simply run $("#ajax-progress-dialog").dialog("open"); script before the ajax post and
5                //$("#ajax-progress-dialog").dialog("close"); on the ajax post complate
6                $("#ajax-progress-dialog").dialog({
7                    autoOpen: false,
8                    draggable: false,
9                    modal: true,
10                    height: 80,
11                    resizable: false,
12                    title: "Processing, please wait...",
13                    closeOnEscape: false,
14                    open: function () { $(".ui-dialog-titlebar-close").hide(); } // Hide close button
15                });
16            });
17        })(); 

我理解第3-15行。事实上,我认为我理解第2到16行:这是创建一个匿名函数并将其包装为jquery对象,对吧?不知道为什么需要包装,但更重要的是,我特别不理解第1行:打开“(函数”和17:关闭“)()”。那是什么意思?

顺便说一下,为了完整起见,请注意,调用如下:

$( “#Ajax的进展-对话”)对话框( “开放”);

信用:此示例来自tugberkugurlu

5 个答案:

答案 0 :(得分:1)

它基本上创建了一个匿名函数并立即运行它。这对于创建闭包很有用,例如使用var x, y, z运行代码而不会污染当前(通常是全局)范围。

答案 1 :(得分:1)

它是一个自我执行的函数,基本上它将所有内容都保留在全局范围之外。在帖子中解释:What is the purpose of a self executing function in javascript?

但是在这个示例代码中,您显示它不是必需的。

的文件准备好了
$( function(){
    ...
});

做同样的事情。

答案 2 :(得分:0)

当使用匿名函数调用$()时,一旦DOM准备就会调用给定的匿名函数。这是$ .ready()的快捷方式。有关相关信息,请参阅http://api.jquery.com/ready/

至于第一行和最后一行,我相信它正在声明另一个匿名函数,然后立即调用它。不过,我并不完全是为什么与编写函数的内容有所不同。

编辑:Kolink是对的,用于限制范围。但是,在这个特定的例子中,这似乎没有任何好处。

答案 3 :(得分:0)

此方法用于创建闭包并“保护”变量。

http://jibbering.com/faq/notes/closures/

答案 4 :(得分:0)

这不是jQuery特有的东西,但它被称为闭包。这意味着你在其中使用的任何内容仍然在该闭包的范围内,因此它不会与其他地方使用的代码冲突(当你使用大量脚本或jQuery插件时很重要)。

您可能会看到传递窗口和文档参数的示例,作为document ready等效项:

(function(document, window) {
    var closure_test = 'Hello world!'

    console.log(window.location.href, closure_test);

})(document, window);

console.log(closure_test);

通过Chrome的JS控制台(或Firebug)运行,您会注意到closure_test可以在闭包内部访问,但在其外部未定义。

您可以使用它进行更多操作,您的示例代码无法演示。例如。使用它来模仿一个类而不使用原型:

var exClass = (function() {

    function private() {
        return 'I am private';
    }

    // return an object of functions or properties we want to expose
    return {
       public: function() {
           return 'I am publicly accessible';
       }
    }
})();

console.log(exClass.public());
// I am publicly accessible

console.log(exClass.private());
// object has no method 'private'

console.log(private());
// undefined

注意你怎么不能进入名为private的函数,但你可以使用名为public()的函数。