为什么使用立即调用的函数来创建新对象?

时间:2015-03-31 13:51:04

标签: javascript

在一本名为 Testable JavaScript 的书中,使用了以下代码模式(忽略具体内容):

var Obj = (function() {
    return function() {
        var docRoot = '/somewhere';
        this.validateDocRoot = function(val) {
            // validation logic - throw Error if not OK
        };
        this.setDocRoot = function(val) {
            this.validateDocRoot(val);
            docRoot = val;
        };
        this.getDocRoot = function() {
            return docRoot;
        };
    };
}());

var myObject = new Obj();

但为什么将Obj视为一个立即调用的函数?也就是说,这种模式与以下代码模式之间的区别是什么:

var Obj = function() {
        var docRoot = '/somewhere';
        this.validateDocRoot = function(val) {
            // validation logic - throw Error if not OK
        };
        this.setDocRoot = function(val) {
            this.validateDocRoot(val);
            docRoot = val;
        };
        this.getDocRoot = function() {
            return docRoot;
        };
    };

var myObject = new Obj();

在这两种情况下,myObject是否相同?

1 个答案:

答案 0 :(得分:1)

你的例子没有区别。 通常立即调用的函数用于实现模块模式(http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript),它可以帮助您封装不希望在全局范围内的数据。

您的示例可以重写为

var myObject = (function() {
    var docRoot = '/somewhere';
    return {
        validateDocRoot : function(val) {
            // validation logic - throw Error if not OK
        },
        setDocRoot : function(val) {
            this.validateDocRoot(val);
            docRoot = val;
        },
        getDocRoot : function() {
            return docRoot;
        }
    };
}());

在这种情况下,使用立即调用的函数确实很重要。在您的第一个示例中,它只会添加语法噪音。