与关键字'this'关闭混淆

时间:2016-10-19 06:25:30

标签: jquery module closures

以下是我的模块。我想用self命名'Module'。 因此,在模块内部,我将此分配给自己。有了这个,我可以将内部封闭称为“自我”而不是这个,这就是我的想法。但它给出了错误;

如何使用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();
});

1 个答案:

答案 0 :(得分: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可能会让其他工作人员感到困惑在代码中。