Javascript литерал теряет свои переменные при вызове с setTimeout - PullRequest
2 голосов
/ 09 июня 2009

У меня есть этот кусок кода, и он не работает так, как я ожидаю (это демонстрационный код, полученный из более крупной программы):

<!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), в первом окне предупреждения отображается «true», во втором «undefined».

Мои вопросы: почему и как мне этого избежать?

Ответы [ 3 ]

11 голосов
/ 09 июня 2009

setTimeout выполнит переданную функцию в контексте окна, поэтому «this» относится к окну. Попробуйте вместо этого:

setTimeout(function(){
    test.go();
}, 500);
4 голосов
/ 09 июня 2009

изменить строку

setTimeout(test.go, 500);

с

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

и ваш скрипт будет работать нормально.

2 голосов
/ 09 июня 2009

Похоже, "это" указывает на что-то еще, когда вы вызываете "идти" из таймаута это, вероятно, указывает на окно.

попробуйте что-то вроде этого

var fn = function(){
    test.go.apply(test, []);
}
setTimetout(fn, 500);
...