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

Why use an immediately invoked function to create a new object?

本文关键字:新对象 创建 对象 函数 调用 为什么      更新时间:2023-09-26

在我正在读的一本名为可测试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在这两种情况下不都是一样的吗?

您的示例中没有任何区别。通常立即调用的函数用于实现模块模式(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;
        }
    };
}());

在这种情况下,使用立即调用的函数是非常重要的。在您的第一个示例中,它只添加了语法噪声。