我不确定为什么在浏览 JS Mixin 模式教程时未定义 `Logger`

I'm not sure why `Logger` is not defined when I'm going over a JS Mixin pattern tutorial

我正在尝试学习一些编程,我正在阅读 this 教程,但我在控制台 ReferenceError: Logger is not defined --> }(Logger)) 中遇到了这个错误。我认为 tut 的代码和我的代码之间的主要区别在于教程使用下划线的扩展,我想我会使用我在其他地方找到的扩展方法(函数)。

    function extend(destination, source){
        for(var k in source){
            if(source.hasOwnProperty(k)){
                destination[k] = source[k];
            }
        }
        return destination;
    }
    (function () {
        var Logger = {
            log: function (message) {
                if (window.console && typeof console.log === "function") {
                    console.log(message);
                }
            }
        };

        return Logger;
    }());

    (function ( Logger) {
        var MyObject = function () {
            this.doSomething = function () {
                this.log("My Object is doing something!");
            };
        };

        // This copies the members of the `Logger` object onto the prototype of `MyObject`
        extend(MyObject.prototype, Logger);

        return MyObject;
    }(Logger))

    var obj = new MyObject();
    obj.doSomething();

可能问题是我不知道如何使用自调用匿名函数。

因为您没有存储由烹饪 Logger 对象的匿名函数返回的结果。

var Logger = (function () {
    var Logger = {
        log: function (message) {
            if (window.console && typeof console.log === "function") {
                console.log(message);
            }
        }
    };

    return Logger;
}());

现在,您可以使用 Logger

Logger 未定义,因为您将它作为第一个自调用函数中的局部变量。要使其可用,您应该这样做:

var Logger = (function () {
        var Logger = {
            log: function (message) {
                if (window.console && typeof console.log === "function") {
                    console.log(message);
                }
            }
        };

        return Logger;
    }());

但是你和MyObject有同样的问题,所以你必须做

var MyObject = ( function() { .... } (Logger) )