【问题标题】:Closure confusion with keyword 'this'关闭与关键字“this”的混淆
【发布时间】:2017-02-28 15:23:51
【问题描述】:

下面是我的模块。我想用 self 命名“模块”。 所以在模块内部,我将它分配给 self.有了这个,我可以在闭包内部将 Module 称为“self”而不是 this,这就是我的想法。但它给出了错误;

如何使用 self 或任何其他变量名代替模块名?

jQuery(document).ready(function($) { 
        var Module =  (function(sendTo){
            var self = this;
            return {
                init: function() {
                    console.log('start');
                    this.login(); //ok
                    Module.login() //ok
                    self.login() //TypeError: self.login is not a function

                },

                login: function() {
                    console.log('login');

                }
            }

        })(interface);

        Module.init();
});

【问题讨论】:

    标签: jquery module closures


    【解决方案1】:

    在您的代码中,self 具有您创建对象时的值this;它没有引用您的对象。当您调用Module.init 时,将this 设置为调用期间init 属性来自的对象的常用机制。

    如果您想始终通过self 引用您的对象,请将您正在创建的对象分配给它,然后返回:

    jQuery(document).ready(function($) { 
            var Module =  (function(sendTo){
                var self = {                     // ***
                    init: function() {
                        console.log('start');
                        this.login();
                        Module.login();
                        self.login();
                    },
    
                    login: function() {
                        console.log('login');
    
                    }
                };
                return self;                     // ***
    
            })(interface);
    
            Module.init();
    });
    

    但请注意,您的代码之外的任何内容都无法更改selfModule,因此为同一个对象设置两个标识符有点多余。另请注意,self 是您要隐藏的内置全局变量(这是引用 window 的另一种方式,略有不同),因此 self 可能会使其他使用代码的人感到困惑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多