javascript闭包onreadystatechange

javascript闭包onreadystatechange,javascript,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");

为什么我更改时不分析代码

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;
        }
    }
})();
进入


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

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

您可以使用
this.switched\u on()
,假设
trigger()
方法被调用为
comments\u switcher.trigger()

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

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

如果您这样做了:

xmlhttp.onreadystatechange = comments_switcher.trigger;
…它将失败。您可以将其更改为:

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

问题到底是什么?我没有看到ReadyStateChange的处理……这只是一个理论问题。回答这个问题不需要任何处理。整个过程毫无意义。@jsumners:switched_on
函数已从局部作用域函数移到返回对象的方法。但是
.trigger()
方法引用函数的方式没有改变。是的,但这并不意味着这个问题有任何意义。“未解析”是什么意思?没有什么是无效的,所以它应该“解析”得很好。为什么问题中提到了
onreadystatechange
,但似乎与内容无关?是的,但这是我的问题:)我需要知道它失败的原因。@John:我回答的第一部分说明了原因。您不再打开名为
的局部变量
,因此没有可引用的内容。由于已将其移动到对象,因此需要将其作为对象的属性进行访问。我的答案的最后一部分是基于推测,因为我不知道您是如何调用
trigger()
方法的。switched_on不是变量,它始终是一个函数。第一条注释是关于xmlhttp的,但不是注释切换器。@John:语法是函数声明的语法,它实际上变成了一个局部变量。我不担心语义上的小问题。如果您想知道这两个
xmlhttp.onreadystatechange
赋值之间有什么区别,那是因为第一个赋值将方法与对象分离,因此在调用时,该方法没有该对象的内存。第二个函数维护对象和方法之间的关系。如果有一个名为f的函数,并且指定了名称f,该怎么办?在这种情况下,它也不起作用。
xmlhttp.onreadystatechange = function() { comments_switcher.trigger() };