Jump to content
  • 0

Проблема контекста с setInterval


nim
 Share

Question

<html><body><script>

function test()
{
this.v1 = 0;
var v2 = 0;
var tid = setInterval(foo, 20)

function foo()
{
if (this.v1 == 10)
{
clearInterval(tid);
}
else
{
this.v1 += 1; //а здесь this хз знает что
v2 += 1;
}
}

this.mes = function mes()
{
alert(this.v1 + " - this.v1 должен быть равен 10");
alert(v2 + " - v2 тоже должен быть равен 10");
}
}

var t = new test();

setTimeout(mes, 2500)

function mes()
{
t.mes();
}

</script></body></html>

Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0
<html><body><script>

function test()
{
this.v1 = 0;
var v2 = 0;
var tid = setInterval(foo, 20)
var self = this;
function foo()
{
if (self.v1 == 10)
{
clearInterval(tid);
}
else
{
self.v1 += 1; //а здесь this хз знает что
v2 += 1;
}
}

this.mes = function()
{
alert(this.v1 + " - this.v1 должен быть равен 10");
alert(v2 + " - v2 тоже должен быть равен 10");
}
}

var t = new test();

setTimeout(mes, 2500)

function mes()
{
t.mes();
}

</script></body></html>

Link to comment
Share on other sites

  • 0
setTimeout() - метод объекта window. Поэтому this ссылается не хз на что, а на [window]. Учите теорию.

Чей конкретно метод setTimeout для значения this вызываемой функции не имеет никакого значения, можно его даже сделать методом нужного объекта, это не важно. Важно как (в какой форме) происходит вызов, но нам это неизвестно, т.к. вызов жив?т, условно говоря, где-то в недрах хостового setTimeout, известен только конечный результат - значением this становится window приблизительно также, как это обычно происходит при вызове вложенной функции. Обычно проблема правильной связи решается уходом от this в пользу переменной (тот же self) или оставив this, но добавив в качестве "прокси" замыкание:

var x = 'preved',
o = { x: 'medved', y: function() { alert(this.x); } };

setTimeout(o.y, 1000); //-> preved
setTimeout(function () { o.y(); }, 2000); //-> medved

p.s. некоторые браузеры передают значение this дополнительным аргументом.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy