Это должно быть обязательным чтением для программистов на Javascript, начинающих работать с языком (и с Stackoverflow).
В отличие от Java, нет никакого внутреннего "связывания" функций с любым объектом, независимо от того, как они объявлены. Привязка контекста объекта происходит только во время вызова функции. Таким образом, когда вы передаете ссылку на функцию в нечто вроде «setTimeout», совершенно не имеет значения, что вы получили функцию из какого-то объекта. Это просто функция, и setTimeout будет вызывать ее с контекстом по умолчанию & mdash; window
объект.
Есть много способов справиться с этим (и я не буду называть это «проблемой»; это факт языка и очень мощный). Если бы вы использовали какой-то фреймворк, это было бы проще.
Другое дело: вы связываете свои обработчики тайм-аута и интервала как строки, содержащие код. Это довольно уродливая практика, поэтому вы должны привыкнуть к формированию выражений функций & mdash; то есть выражения, значения которых являются функциями.
Например, для вашего обработчика slideItem вы можете сделать следующее:
// ...
setTimeout(function() { slideItem.changeSlide(); }, 5000);
Таким образом, функция, вызываемая механизмом тайм-аута, всегда будет вызывать «changeSlide» с вашим объектом «slideItem» в качестве контекста. Вам не нужен этот параметр «self» в «changeSlide», потому что «this» будет указывать на нужный объект.
[править] Я отмечаю, что вы на самом деле используете jQuery, и это хорошо.