Si está utilizando GreaseMonkey, las funciones que defina son de espacio aislado por GM y no estarán disponibles en la ventana principal.
Sin embargo, cuando utiliza cualquiera de las funciones nativas, como setTimeout o alert, se llaman en el contexto de la ventana principal, por ejemplo; cuando se llama a setTimeout en realidad se está llamando window.setTimeout()
Ahora la función que ha definido, marca no existe en la ventana principal y lo que están pidiendo setTimeout que hacer es evaluar la cadena 'marca() '. Cuando se extingue el tiempo de espera window.eval('mark()')
y como se indicó, window.mark no está definido. Por lo tanto, tiene un par de opciones:
1) Defina marca en el objeto ventana.GM le permite hacer esto a través de la unsafeWindow objeto como éste:
unsafeWindow.mark = function(){}
setTimeout('mark()', 10); //this works but is ugly, it uses eval
2) Pasar una referencia a la marca local de a setTimeout:
function mark(){}
setTimeout(mark, 10); //this works too but you can't send parameters
Pero lo que si es necesario para enviar los parámetros? Si ha definido su función en la ventana principal, el método eval funcionará (pero es fea - no lo haga)
unsafeWindow.mark2 = function(param) {
alert(param)
}
setTimeout('mark2("hello")', 10); //this alerts hello
Pero este método funcionará para las funciones con parámetros si se han definido en la ventana principal o simplemente en GM la llamada se envuelve en una función anónima y pasó a setTimeout
setTimeout(function() {
mark2("hello")
}, 10); //this alerts hello
es la función definida dentro de otra función, por casualidad? –
¿qué entorno estás usando? Funciona bien - http://jsfiddle.net/russcam/6EXa9/ –
Esto no está funcionando ... para mí .. No entiendo por qué? La función no está dentro de ninguna función, ¡es global! –