Решение: не используйте this
.
Вот альтернативный способ определения MyHandler_onLoad
function MyHandler_onLoad() {
var onload_handler = {
scan: function() {
do_scan(onload_handler.browser); // onload_handler.browser == undefined
},
register = function() {
onload_handler.tab.addEventListener("load", onload_handler.scan, false);
},
unregister = function() {
onload_handler.tab.removeEventListener("load", onload_handler.scan, false);
}
};
onload_handler.tab = gBrowser.selectedTab;
onload_handler.browser = gBrowser.selectedBrowser;
onload_handler.register();
window.addEventListener("unload", bind(onload_handler, onload_handler.unregister), false);
return onload_handler;
}
Еще лучше? Переместить глобальные зависимости вверх и не иметь доступа к вкладкам и свойствам браузера (т.е. сделать их «приватными»)
Вы можете даже выбрать, чтобы скрыть функции регистрации и отмены регистрации, поскольку я не уверен, что они вам даже нужны, так как кажется, что они уже присоединяются.
var handler = MyHandler_onLoad(gBrowser.selectedTab, gBrowser.selectedBrowser);
function MyHandler_onLoad(tab, browser) {
var onload_handler = {
scan: function() {
do_scan(browser); // browser == undefined
},
register = function() {
tab.addEventListener("load", onload_handler.scan, false);
},
unregister = function() {
tab.removeEventListener("load", onload_handler.scan, false);
}
};
onload_handler.register();
window.addEventListener("unload", bind(onload_handler, onload_handler.unregister), false);
return onload_handler;
}
В частности, ваша проблема с this
заключается в том, что он указывает на функцию сканирования, а не на ваш объект-обработчик. Если вы вообще не используете this
, вы никогда не столкнетесь с подобными ошибками.
О, и вам не нужно использовать new
.