Javascript 无法实现模块模式

Javascript 无法实现模块模式,javascript,closures,Javascript,Closures,我试图复制Douglas Crockford的《Javascript:好的部分》一书中的一些代码。其思想是使用闭包进行对象封装,避免Javascript固有的全局变量 var serial_maker = function ( ) { // Produce an object that produces unique strings. A // unique string is made up of two parts: a prefix // and a sequence number.

我试图复制Douglas Crockford的《Javascript:好的部分》一书中的一些代码。其思想是使用闭包进行对象封装,避免Javascript固有的全局变量

var serial_maker = function (  ) {

// Produce an object that produces unique strings. A
// unique string is made up of two parts: a prefix
// and a sequence number. The object comes with
// methods for setting the prefix and sequence
// number, and a gensym method that produces unique
// strings.

    var prefix = '';
    var seq = 0;
    return {
        set_prefix: function (p) {
            prefix = String(p);
        },
        set_seq: function (s) {
            seq = s;
        },
        gensym: function (  ) {
            var result = prefix + seq;
            seq += 1;
            return result;
        }
    };
}(  );

var seqer = serial_maker(  );
seqer.set_prefix = 'Q';
seqer.set_seq = 1000;
var unique = seqer.gensym(  );    // unique is "Q1000"
Chrome正在检测错误:

未捕获的TypeError:属性 对象[对象]的“序列生成器” DOMWindow]不是一个函数 (匿名函数)

我做错了什么


编辑:我应该说这段代码完全是从书中复制和粘贴的…

您试图将函数的结果作为函数执行,并为函数赋值。 尝试:


另请参见此

此代码示例中有两个错误:

  • serial_maker的定义以()完成,该函数调用匿名函数。这就是下一行:

    var seqer = serial_maker();
    
    错误,因为serial_maker不是函数,而是匿名函数返回的对象

  • 修复前一个错误后,将显示两行:

    seqer.set_prefix = 'Q';
    seqer.set_seq = 10000;
    
    应改为:

    seqer.set_prefix('Q');
    seqer.set_seq(10000);
    

  • (来源:)

    我正在阅读这本书,当我将它与这本书进行比较时,我在您发布的代码中看到了一对多余的括号()。 你有:

            }
        };
    }(  );
    
    应该是:

            }
        };
    };
    

    此外,还有一些额外的答案,其中“Q”和“1000”需要包装在()中。

    很高兴我能帮上忙。这真的很奇怪,Crockford的错误代码(我在2008年的原著中也找到了)。
            }
        };
    };