Например, можно назначить обработчик вот так.
function test() {
var text = "hello!"
document.onclick = function() {
alert(text);
}
}
test()
При клике выведется "hello!", т.к. функция-обработчик имеет замыкание на переменную text. Любые другие колбеки, такие как setTimeout или ajax запросы также будут иметь доступ к переменным функции, это основной способ передать в колбек.
function deferedAlert(text) { // функция, выводящая сообщение через 3 секунды
setTimeout(function (){ alert(text) }, 3000)
}
deferedAlert("hello")
Действительно, можно реализовать private свойства в функции-конструкторе объекта (protected обычно реализуется соглашением, что с _ начинаются protected методы)
function SomeClass() {
var self = this;
var private = "private";
self.alert = function() {
alert(private)
}
}
Подробнее в статьях про ООП в JS на этом сайте.