Конструктор функции создает глобальную функцию, а не лексически внутри вашей функции. Следовательно, он не имеет доступа к вашей локальной функции open, поэтому он использует метод open окна.
Из моих тестов ваш код всегда должен ссылаться на метод глобального открытия, независимо от того, запускается он из букмарклета или самой страницы.
Посмотрите на этот пример:
(function(){
function giveme5(x) { return 5;}
var func = new Function("return giveme5()");
// should output 5, but we get an error, giveme5 is not defined
console.log( func() );
})()
Вот возможное решение вашей проблемы
(function(){
// Binds an argument to a method, this could be much better, but serves our
// purpose here
function bindArg(fun, arg) {
return function() {
fun.call(this, arg);
}
}
function toggleTable(table) {
var rows = table.rows;
for (var j=1; j<rows.length; j++){
if(rows[j].style.display == 'none' ){
rows[j].style.display = '';
} else if(rows[j].style.display == ''){
rows[j].style.display = 'none';
}
}
}
var tableList = document.getElementsByTagName("table");
for ( var i=0; i<tableList.length; i++){
var table = tableList[i];
for ( var j=0; j < table.rows.length;j++){
if( j != 0){
table.rows[j].style.display = 'none';
} else {
table.rows[j].onclick = bindArg(toggleTable, table);
}
}
}
})();