66-解决方案
5.16.2 解决方案
确定jQuery是不是问题来源的方法之一是用不包含jQuery的其他JavaScript代码代替你的jQuery代码。在这个例子中,可以用简单的 alert() 替代jQuery代码:
function delayLog( text ) {
setTimeout( "alert(text)", 1000 );
}
当尝试这个版本的代码时,发生了同样的问题:没有显示警告信息,Firebug同样报告 text 未定义。
这并没有确定问题所在,但是已经大大缩小了范围。很明显,这不是jQuery的问题(除非jQuery程序库的存在妨碍了你的页面,但是你可以在一个不包含jQuery简单的测试页面中运行上述代码,排除这种可能性)。所以,问题肯定出现在代码自身,最有可能与使用serTimeout()的方式有关。
确实,这里的问题是当 setTimeout() 接受一个字符串参数时,它执行于全局作用域,也就是说,它位于任何函数之外。最简单的修复手段就是使用一个局部函数作为回调,代替文本字符串:
function delayLog( text ) {
setTimeout( function() {
alert(text);
}, 1000 );
}
和以字符串方式调用 setTimeout() 的代码不同,嵌套的函数完全能够访问外部函数的变量和参数。所以,这段代码能够按照预期显示文本警告。
最后,原来的jQuery代码修改如下:
function delayLog( text ) {
setTimeout( function() {
$('#log').show().html(text);
}, 1000 );
}