Достижение объекта - PullRequest
       14

Достижение объекта

2 голосов
/ 19 декабря 2011

В моем приложении есть объект с несколькими свойствами, которые устанавливаются в различных местах приложения.

В одной из моих функций-прототипов у меня есть функция, которая запускается с интервалами для обновления таймера, и в этой функции должно быть установлено свойство (this.) TheTime. Проблема в том, что этого не происходит, и я предполагаю, что причина в том, что this.theTime указывает на саму функцию, а не на объект.

Ниже приведены две версии моего кода, и ни одна из них не работает. Любые советы для меня?

// 1.
function changeTime() {
    this.theTime = setTime(time);
    time.setSeconds(time.getSeconds()+1);
    p1.html(this.theTime);
}
interval = setInterval(changeTime(), 1000 );

// 2.
function changeTime(theTime) {
    theTime = setTime(time);
    time.setSeconds(time.getSeconds()+1);
    p1.html(theTime);
}
interval = setInterval( function() { changeTime(this.theTime); }, 1000 );

...

Слишком ясно, функция выше обновляет таймер (например, 00:00:01 -> 00:00:02) каждую секунду, и я хочу, чтобы this.theTime обновлялось со временем.

Когда таймер останавливается (что происходит в другой функции-прототипе), я хочу иметь возможность видеть, в какое время таймер остановился, но в настоящее время this.theTime является значением по умолчанию, что означает, что функция выше не ' t обновить свойство объектов. Вместо this.theTime в функции выше должна быть локальная переменная.

ПРИМЕЧАНИЕ: setTime() - это другая функция, которая существует в той же функции-прототипе, что и функция выше.

Ответы [ 5 ]

1 голос
/ 19 декабря 2011

Хорошо, когда вы используете это в какой-то функции, this ссылается на объект, которым на самом деле является функция.Здесь:

function myF() {
    this.var = 'hey';
}

Вы можете достичь var, используя это (myF в качестве функции конструктора):

var obj = new myF();
alert(obj.var);

Или здесь:

function myF2() {
    if (typeof this.var === 'undefined') {
        this.var = 0;
    } else {
        this.var += 1;
    }
    alert(this.var);
}

Здесь var снова является свойством myF2 (которое, как я уже сказал, не просто функция, потому что в JavaScript функции являются объектами).Каждый раз, когда вы вызываете myF2, this.var будет увеличиваться и оповещаться (только при первом вызове он будет инициализирован).

Во второй функции (анонимная функция используется во втором setInterval) выделая то же самое.

Одним из решений является сделать глобальное время в обоих случаях, поэтому вам не нужно использовать:

this.theTime

Таким образом, результат может быть примерно таким:

var theTime = 0, interval;
function changeTime() {
    theTime += 1;
    document.body.innerHTML = theTime;
    setInterval
}

interval = setInterval(changeTime, 1000 );

http://jsfiddle.net/u3EuC/

0 голосов
/ 21 декабря 2011

Джейсон, после вашего разъяснения, я считаю, что лучше дать вам совершенно новый ответ, пытаясь объяснить это утверждение в JS как можно лучше (и проще). Надеюсь, это поможет.

<html>
<body>
<div id="output1"></div>
<div id="output2"></div>
<script>
// theTime is undefined in global scope

function obj(target) {
  var theTime = 0; 
  var that = this; // var means "private"
  this.changeTime = function() { // here "this" points to obj and means "public"
    theTime++; // no var => outer scope = obj scope
    // here "this" points to changeTime function, not to obj!
    // "that" points to obj, you may use that.theTime
    document.getElementById(target).innerHTML = theTime;
  }
}

var o1 = new obj("output1");
var o2 = new obj("output2");

setInterval(o1.changeTime,1000); // update output1 content every second
setInterval(o2.changeTime,500); // update output2 content twice a second
</script>
</body>
</html>
0 голосов
/ 19 декабря 2011

Вы правы, предполагая, что с ключевым словом this что-то не так. this в JavaScript немного сложнее, поэтому использовать его в функциях (особенно с setTimeout или setInterval рискованно.

Что вы хотите сделать, это сохранить значение this при создании функции.

Вот дополнительная информация: http://justin.harmonize.fm/index.php/2009/09/an-introduction-to-javascripts-this/

0 голосов
/ 19 декабря 2011

Возможно, эти комментарии направят вас на правильный путь

var theTime; // global variable
function changeTime() {
    theTime = setTime(time); // theTime is global variable declared above (accesible from anywhere)
    // var myTime = setTime(time); // myTime is local variable
    time.setSeconds(time.getSeconds()+1);
    p1.html(theTime);
}
interval = setInterval(changeTime, 1000 ); // no braces
0 голосов
/ 19 декабря 2011

Вы можете легко проверить, написав

debugger;

, чтобы установить точку останова в ваших функциях. Тогда может быть довольно легко найти вашу проблему.

...