2

我有这段代码,但它并没有像我预期的那样工作(它是演示代码,从一个更大的程序中提炼出来):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Test</title>

<script language="javascript" type="text/javascript">
var test = {
    variable: true,
    go: function() {
        alert(this.variable);
    }
};

function s() {
    test.go();
    setTimeout(test.go, 500);
}

</script>

</head>
<body>
<form action="#">
<input type="button" value="Go" onclick="s();" />
</form>
</body>
</html>

当我在 IE 和 FF(我关心的唯一浏览器 atm)中单击 Go 按钮时,第一个警报框显示“true”,第二个“未定义”。

我的问题是为什么,以及如何避免它?

4

3 回答 3

11

setTimeout将在窗口的上下文中执行传递的函数,因此“this”指的是窗口。试试这个:

setTimeout(function(){
    test.go();
}, 500);
于 2009-06-09T15:21:02.940 回答
4

换行

setTimeout(test.go, 500);

setTimeout(function(){test.go()}, 500);

并且您的脚本应该可以正常工作。

于 2009-06-09T15:20:57.683 回答
2

当您从超时调用“go”时,“this”似乎指向其他内容。它可能指向窗口。

尝试这样的事情

var fn = function(){
    test.go.apply(test, []);
}
setTimetout(fn, 500);
于 2009-06-09T15:19:13.723 回答