javascript关闭onreadystatechange

时间:2013-05-09 16:47:11

标签: javascript

为什么在我更改

时不会解析代码
var comments_switcher = (function(){
    var switcher = null;
    var show = 'Show comments';
    var hide = 'Hide comments';
    function init(){
        if ( switcher == null ) switcher = document.getElementById("comments_switch");
    }   
    function switched_on(){     
        return switcher.value == show;
    }
    return {
        trigger : function(do_init){
            if ( do_init ) init();
            switcher.value = switched_on() ? hide : show;
        }
    }
})();

进入

var comments_switcher = (function(){
    var switcher = null;
    var show = 'Show comments';
    var hide = 'Hide comments';
    function init(){
        if ( switcher == null ) switcher = document.getElementById("comments_switch");
    }   

    return {
            trigger : function(do_init){
               if ( do_init ) init();
               switcher.value = switched_on() ? hide : show;
            },
            switched_on : function(){       
               return switcher.value == show;
            }
    }
})();

为什么xmlhttp.onreadystatechange在提供函数对象而不是function() {}时不起作用?

1 个答案:

答案 0 :(得分:1)

您需要从返回的对象中引用switched_on方法,因为它不再是变量。

您可以使用this.switched_on(),假设trigger()方法被调用为comments_switcher.trigger()

return {
    trigger : function(do_init){
        if ( do_init ) init();
        switcher.value = this.switched_on() ? hide : show;
// -----------------------^
    },
    switched_on : function(){       
       return switcher.value == show;
    }
}

但同样,这依赖于this被正确设置为返回的对象。这取决于您调用trigger的方式。


如果你这样做了:

xmlhttp.onreadystatechange = comments_switcher.trigger;

......它会失败。您可以将其更改为:

xmlhttp.onreadystatechange = function() { comments_switcher.trigger() };