正确打包JS代码而不必担心“这个”

时间:2014-08-07 20:52:35

标签: javascript jquery this

我有一些JS代码,并希望将其打包以便易于使用。 我有这个:

var myID = {
windowref : undefined,
intervalID : null,
 checkLogin : function(){
    if (this.windowref==undefined){
        console.log(windowref)
        console.log("no ref yet")
        return false;
    }
    if (this.windowref.closed){
        console.log("window closed")
        clearInterval(this.intervalID)
        this.intervalID=null
    }
    if (this.windowref.location.href=='mycallbackurl'){
        console.log("login detected")
        clearInterval(this.intervalID)
        this.intervalID=null
        this.windowref.close()
    }
},
login_process: function(){
    this.windowref = window.open('oneURL',
        "login with MY ID","width=600, height=400")
    console.log(self)
    if (this.windowref!=null){
        this.intervalID =  setInterval(this.checkLogin,500)
    }
}
}

当我试图像这样使用它时:

$(document).ready(function(){
   $('a#login_push').on("click",myID.login_process.bind(myID)); 
});

我遇到了这个'这个'不在适当的范围内(范围限定为jquery返回的元素。 我改成了:

var myID = {
    windowref : undefined,
    intervalID : null,
     checkLogin : function(){
        if (this.windowref==undefined){
            return false;
        }
        if (this.windowref.closed){
            console.log("window closed")
            clearInterval(this.intervalID)
            this.intervalID=null
        }
        if (this.windowref.location.href=='mycallbackurl'){
            console.log("login detected")
            clearInterval(this.intervalID)
            this.intervalID=null
            this.windowref.close()
        }
    },
    login_process: function(){
        this.windowref = window.open('myloginurl',
            "login with my ID","width=600, height=400")
        if (this.windowref!=null){
            this.intervalID =  setInterval(this.checkLogin.bind(myID),500)
        }
    }
}

如果我在设置事件处理程序时也绑定,则此方法有效:

$(document).ready(function(){
   $('a#login_push').on("click",myID.login_process.bind(myID)); 
});

是否有适当的"写这个的方式,这样我就可以将它打包成一种" SDK"并且开发人员只需要做某种事情:

 $(document).ready(function(){
       $('a#login_push').on("click",myID.login_process); 
    });

我尝试在对象文字中将self设置为this,然后使用self而不是this,但它不起作用。

1 个答案:

答案 0 :(得分:1)

如评论中所述,您可以使用myID代替this。另一种方法是导出函数的绑定版本:

myID.login_process = function () {
    // ...
}.bind(myID);