如何在递归函数中使用闭包而不丢失JavaScript中的作用域? tem.jqw.Callback对象包含一个可执行函数,即CSS选择器。和循环延迟 tem.jqw.wait等待jQuery被加载,然后遍历tem.jqw.Callback对象数组,并在找到传入CSS选择器的元素后执行其函数

如何在递归函数中使用闭包而不丢失JavaScript中的作用域? tem.jqw.Callback对象包含一个可执行函数,即CSS选择器。和循环延迟 tem.jqw.wait等待jQuery被加载,然后遍历tem.jqw.Callback对象数组,并在找到传入CSS选择器的元素后执行其函数,javascript,object,recursion,scope,closures,Javascript,Object,Recursion,Scope,Closures,我遇到的问题是tem.jqw.Callback对象中的run函数。第一次调用run函数时,如果元素存在,则一切正常,可执行函数运行正常。但是,如果元素还不存在,并且我们需要循环,那么函数在setTimeout(this.run,100)执行一次后将失去作用域。例如,当第二次执行run函数时,this.selector或this.fn将变得未定义。我如何在不使用全局变量的情况下解决这个问题?提前谢谢 if(tem的类型!=“对象”){ tem={}; } tem.jqw={}; tem.jqw.

我遇到的问题是tem.jqw.Callback对象中的run函数。第一次调用run函数时,如果元素存在,则一切正常,可执行函数运行正常。但是,如果元素还不存在,并且我们需要循环,那么函数在setTimeout(this.run,100)执行一次后将失去作用域。例如,当第二次执行run函数时,this.selector或this.fn将变得未定义。我如何在不使用全局变量的情况下解决这个问题?提前谢谢

if(tem的类型!=“对象”){
tem={};
}
tem.jqw={};
tem.jqw.retries=0;
tem.jqw.maxRetries=100;
tem.jqw.delay=100;
tem.jqw.callbacks=[];
tem.jqw.Callback=函数(fn、选择器、延迟){
这个.fn=fn;
this.selector=(typeof selector==“string”&&selector.length>0)?选择器:文档;
this.delay=(延迟类型==“数字”和延迟>0和延迟<1000)?延迟:100;
此参数为0;
此.maxRetries=100;
this.start=函数(){
这个。run();
};
this.run=函数(){
if(jQuery(this.selector).length>0){
console.log(“[OPDEBUG]tem.jqw.Callback.run说:“+this.selector.toString()+”准备就绪。正在执行回调函数…”);
这是fn();
}否则{
这个.retries++;
log(“[OPDEBUG]tem.jqw.Callback.run说:typeof this.selector”+typeof this.selector);
log(“[OPDEBUG]tem.jqw.Callback.run说:等待“+this.selector.toString()+”);
if(this.retriestem.jqw.wait()您可以使用bind设置此

this.run()
更改为

this.run.bind(this)
最好将此赋值给另一个变量(例如)


然后传递self以获得更好的可读性

setTimeout(this.run.bind(this),100)
this.run.bind(this)有效!我在哪里做:var self=这个?这是在run函数中要做的第一件事吗?然后,我需要做什么:setTimeout(self.run,100)?谢谢我更喜欢用一个名字来描述对象,而不是自我,这个或那个并没有更多的描述性。可能
callback=this
var self = this;