2011-10-21 18 views
16

que he tenido un problema con este pequeño fragmento:no puede utilizar "descarga" como un nombre de función en Javascript

<script> 
function download() { 
    alert('Hi'); 
} 
</script> 
<a href="#" onClick="javascript:download();">Test</a> 

Una vez que haga clic en el enlace en Chrome 14.0, aparece un

Uncaught TypeError: string is not a function 

en Firefox y IE funciona muy bien. Resolví el problema cambiando el nombre de la función, pero todavía tengo curiosidad por saber qué hay con la cosa de "descarga" en Chrome. No es una palabra reservada por lo que sé, ¿qué podría ser?

+0

¿Tiene alguna extensión instalada? –

+4

Confirmado. Incluso eliminar el 'javascript:' que no debería estar allí no ayuda. ¡Extraño! –

+1

No use funciones globales. Coloque sus funciones en un espacio de nombres y enlace el controlador de eventos mediante programación. –

Respuesta

21

<a> elementos tiene un atributo download en HTML5 como se explica here, con un valor predeterminado de "" (una cadena vacía).

Esto significa que download === this.download en el controlador onclick (this es el elemento en onevent atributos), y por lo tanto el atributo download del elemento es superior a la propiedad download de window.

This fiddle enumera todos los atributos de cadena que están presentes de forma predeterminada. Usted puede ver download es un atributo como innerHTML, que also fails con el mismo motivo cuando se utiliza como una función (es decir, tratando de hacer referencia a window.innerHTML, pero en su lugar ejecutando elem.innerHTML()).

Como se dijo en los comentarios, el uso de window no genera confusión sobre a qué propiedades/variables de atributo se evaluarán.


Este comportamiento alcance no parece realmente a Debido al valor this pero "cadena de ámbito" más bien una específica que se está construyendo.

Según the HTML5 specification:

léxico medio ambiente Ámbito

Vamos Scope ser el resultado de NewObjectEnvironment(the element's Document, the global environment).

Si el elemento tiene un propietario de formulario, deje que Scope sea el resultado de NewObjectEnvironment(the element's form owner, Scope).

Deje Scope Sea el resultado de NewObjectEnvironment(the element's object, Scope).

I.e. lo que está sucediendo es que la cadena de alcance es window ->document ->element (aumento de la superioridad). Esto significa que download evalúa a element.download y no a window.download. Lo que también se puede concluir de esto es que getElementById burbujeará hasta document.getElementById (dado elem.getElementById no existe).

puedo configurar a systematic example de manera que se puede ver cómo las variables propagarse por la cadena de ámbitos:

window.a = 1; 
document.a = 2; 
elem.a  = 3; 

window.b = 4; 
document.b = 5; 

window.c = 6; 

Entonces, <a ... onclick="console.log(a, b, c)"> registros 3, 5, 6 cuando se hace clic.

+0

No me gusta esta cosa de agregación de alcance extraño, o como quiera llamarlo ... lo mismo con los formularios. +1 –

+0

Entonces, ¿eso sugiere que esto podría solucionarse cambiándolo a 'onClick =" window.download() "'? –

+0

@Joe: Sí: http://jsfiddle.net/qavN2/ –

0

Algunos nombres de funciones son simplemente reservados o ya se han utilizado. Otro sería "evaluar".

Te recomiendo anteponer algo a todas tus funciones y nombres de variables para evitar este tipo de situaciones. Ejemplo: "sto_download"

+0

Si saco la definición de función del script, y 'console.log (download)' o 'console.log (download())', entonces obtengo 'download is not defined'. –

+2

Realmente no explica qué está pasando en Chrome, ¿o sí? –

Cuestiones relacionadas