Firefox中的setTimeout问题

the*_*_mr 5 javascript firefox settimeout

菜单系统应该使用以下语句根据给定的延迟进行扩展和折叠(o_item.getprop('hide_delay')返回200并o_item.getprop('expd_delay')返回0):

this.o_showtimer = setTimeout('A_MENUS['+ this.n_id +'].expand(' + n_id + ');',
  o_item.getprop('expd_delay'));
Run Code Online (Sandbox Code Playgroud)

this.o_hidetimer = setTimeout('A_MENUS['+ this.n_id +'].collapse();',
  o_item.getprop('hide_delay'));
Run Code Online (Sandbox Code Playgroud)

我尝试将第一个参数的代码放入单独的函数中,并将这些函数作为setTimeout的第一个参数调用,如下所示:

this.o_showtimer = setTimeout( expandItem(this.n_id, n_id),
      o_item.getprop('expd_delay'));
Run Code Online (Sandbox Code Playgroud)

Firebug产生以下错误消息:

useless setTimeout call (missing quotes around argument?)
Run Code Online (Sandbox Code Playgroud)

崩溃没有延迟.

我把参数放在引号中(尽管这里推荐),像这样:

this.o_showtimer = setTimeout( "expandItem(this.n_id, n_id)",
  o_item.getprop('expd_delay'));
Run Code Online (Sandbox Code Playgroud)

但这没用.似乎没有任何事情发生,并且在代码中抛出一些console.log()消息证实了这一点.

我尝试使用这里推荐的匿名函数调用,这里是这样的:

this.o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
  o_item.getprop('expd_delay'));
Run Code Online (Sandbox Code Playgroud)

但这也行不通.它在IE中产生了不良结果(没有折叠的项目与以前一样)并且在Firefox中没有发生任何事情(在expandItem和collapseItem函数中放置console.log()语句确认它们没有被调用).

我甚至试过做以下事情:

this.o_hidetimer = setTimeout( function() { alert('test'); },
  o_item.getprop('hide_delay'));
Run Code Online (Sandbox Code Playgroud)

那甚至都没有用!似乎有一些调用匿名函数的东西.

发现的setTimeout的值赋值给一个变量其他比this.o_showtimer制成的setTimeout火的左参数.必须与为此分配内容有关.

如果我这样做:

var o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
  o_item.getprop('expd_delay'));
Run Code Online (Sandbox Code Playgroud)

expandItem被调用.但是,如果我这样做:

var o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
  o_item.getprop('expd_delay'));

 this.o_showtimer = o_showtimer;
Run Code Online (Sandbox Code Playgroud)

好像setTimeout可以预测未来!(expd_delay是0!).

Col*_*ine 5

我认为问题在于Javascript对'this'的特殊处理.当您在匿名函数中调用'expandItem'时,您不会将其称为方法,因此'this'将设置为基本范围(窗口).

我建议使用局部变量

var that = this;
this.o_showtimer = setTimeout( function() { expandItem(that.n_id, n_id); },
  o_item.getprop('expd_delay'));
Run Code Online (Sandbox Code Playgroud)