在js对象中使用`this`

时间:2011-03-29 17:11:09

标签: javascript jquery object this

我有以下js对象:

var livePage = {
    delay: 1000,
    loadTables: function(){
        loadTable($("#vbeTable"),'getUpdateA')
        loadTable($("#vbcTable"),'getUpdateB')
        createAlertDialog();
    },
    setClicks: function(){
        $(".expand").live('click',function(){
            expand($(this).attr('expandvalue'));
        })
        $( ".launch" )
            .click(function(){
                newPopup('index.php',1120,550);
            });
        $('.edit').live('click',function(){
            openColPick($(this).attr('colType'))
        });
    },
    setRightClick: function(){
        $('body').contextMenu('mainmenu', {
              bindings: {
                'o_o': function(t) {
                  thePopupWindowsMain('oo','','',220,150,'right','');
                },
                'o_h': function(t) {
                  thePopupWindowsMain('oh','','',285,385,'left','');
                },
                'launch_prog': function(t) {
                  $(".launch").click();
                },
                'logout': function(t){
                    window.top.location = 'logout.php';
                }
              }
            });
    },
    setWindow: function(){
        $(window)
            .resize(function() {
                $('body').css('height', $(this).height())
                alertToCorner();
            })
            .scroll(function(){$(this).resize()});
        $(window).resize();
    },
    checkLogout: function(){
        $.ajax({
            url: 'getLogin.php',
            dataType: "html",
            success: function(data){
                if($.trim(data) == 'LOGOUT'){
                    window.location = 'logout.php';
                }
            },
            complete: function(){
                setTimeout( function () {
                    livePage.checkLogout();},
                livePage.delay)
            },
            timeout: 2000
        });
    },
    init: function(){
        this.checkLogout();
        this.loadTables();
        this.setClicks();
        this.setRightClick();
        this.setWindow();
        console.log(this);
    }
}

由于某些原因checkLogout: function()我必须使用livePage.delaylivePage.checkLogout()当我尝试使用例如this.checklogout()时,我在Chrome的控制台中收到以下错误:

  

未捕获的TypeError:对象[对象   DOMWindow]没有方法'checkLogout'

我该如何解决这个问题?

谢谢!

5 个答案:

答案 0 :(得分:5)

函数this内部不再绑定到外面绑定的任何内容。最简单的解决方案是使用var self = this;分配给另一个var,或者在您的情况下通过context: this的{​​{1}}选项分配。

答案 1 :(得分:3)

你可以尝试,

 checkLogout: function(){
        var self = this; //reference to the livePage object
        $.ajax({
            url: 'getLogin.php',
            dataType: "html",
            success: function(data){
                if($.trim(data) == 'LOGOUT'){
                    window.location = 'logout.php';
                }
            },
            complete: function(){
                setTimeout( function () {
                    self.checkLogout();},  //need to use self because 'this' no longer refers to livePage in this context
                livePage.delay)
            },
            timeout: 2000
        });
    }

答案 2 :(得分:1)

this在js中与在C#等语言中有很大不同。首先,它是功能范围的。其次(可能更重要的是),您可以控制调用函数时this的内容。 (查看“call”和“apply”函数,这些函数在javascript框架中经常使用。)

答案 3 :(得分:0)

在Javascript中阅读this this keyword。在你的情况下,this指的是像错误所说的没有方法'checkLogout'的窗口。

答案 4 :(得分:0)

您应该将context: this属性添加到发送到$.ajax的哈希值,然后在完整的处理程序调用{​​{1}}中添加。

JQuery的this.checkLogout方法将使用ajax作为window上下文调用处理程序,我们可以通过向调用添加this属性来更改它