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