2011-11-29 16 views
9

Esto puede ser una pregunta tonta, pero ¿por qué los argumentos de función en JavaScript no van precedidos por la palabra clave var?¿Por qué los argumentos en JavaScript no van precedidos por la palabra clave var?

qué:

function fooAnything(anything) { 
    return 'foo' + anyThing; 
} 

Y no:

function fooAnything(var anything) { 
    return 'foo' + anyThing; 
} 

Tengo la sensación de que la respuesta es because that's what the Spec says pero aún así ...

+0

¿Por qué quiere la palabra clave allí? 'var' declara variables, los parámetros son (un poco) diferentes. No tiene sentido la palabra clave allí, no agrega ningún valor. –

+0

¿No es esa una razón lo suficientemente buena? ¿Qué información adicional te dará var?además, guardas 4 caracteres cada vez que declaras una función var que puedes poner haciendo que el nombre de la variable sea más largo para mayor claridad :). – Asken

+1

Porque ECMA-262 dice que los parámetros formales, como las variables declaradas, se convierten en propiedades nombradas del objeto variable local antes de que se ejecute cualquier código. Entonces un parámetro formal es más o menos declarado por defecto. – RobG

Respuesta

6

sería un uso redundante de la palabra clave var . Los elementos que aparecen entre paréntesis que siguen una declaración de nombre de función son parámetros explícitos para la función.

+0

Diría que son parámetros _explícitamente_ para la función. – nnnnnn

+0

@nnnnnn buen momento, actualicé mi respuesta –

2

La palabra clave var declara el alcance de la variable. Un argumento de función también introduce el alcance de ese argumento. Por lo tanto, no es necesario, ya que cumple la misma función.

7

La mayoría de los lenguajes de programación de tipo dinámico no tienen tienen vars explícitos en la lista de argumentos. El propósito de la palabra clave var es diferenciar entre "Estoy fijando una variable existente" y "Estoy creando una nueva variable", como en

var x = 17; //new variable 
x = 18; //old variable 

(Sólo algunos idiomas, como Python, voy con la var completamente pero hay algunos problemas con, por ejemplo, los cierres y los errores tipográficos accidentales por lo var aún está muy extendida)

pero en una lista de argumentos no se puede asignar a las variables existentes por lo que la ambigüedad anterior no necesita ser resuelto. Por lo tanto, una declaración var en la lista de argumentos no sería nada más que un texto repetitivo redundante. (Y repetitivo redundante es malo - ver COBOL en exibit A)


Usted probablemente está recibiendo su idea de C o Java, pero en sus declaraciones de tipo caso doblar como declaraciones de variables y de la costra en las listas de argumentos es para los tipos y no para las declaraciones.

Incluso podemos salirse con la suya con una lista de argumentos "sin tipo, varless" también en algunos idiomas. En Haskell, por ejemplo, los tipos pueden inferirse, por lo que no es necesario que los escriba en la lista de argumentos. Debido a esto la lista de argumentos se compone de sólo los nombres de las variables y, como en el caso de Javascript que no es necesario poner el ajeno "vamos" (equivalente de Haskell a "var") allí:

f a b = --arguments are still variables, 
     -- but we don't need "let" or type definitions 
    let n = a + b in --extra variables still need to be declared with "let" 
    n + 17 
+1

Esta es una gran respuesta, ¿por qué no está recibiendo amor :( – Esailija

+0

"Pero en una lista de argumentos no puede asignar variables" - algunos idiomas permiten asignar valores predeterminados en la lista de argumentos (que se aplica si la persona que llama no proporciona los parámetros), pero incluso si JavaScript lo permitiera, no necesitaríamos 'var' al principio de la lista de argumentos. – nnnnnn

1

creo que el La pregunta surge porque estamos acostumbrados a ver function bla (int i) en muchos idiomas. Lo mismo, sintácticamente, como int i; en algún lugar del cuerpo de la función para declarar una variable. Sin embargo, los dos int s no hacen lo mismo; el primero define el tipo, el segundo define el tipo y el alcance. Si no tiene que declarar el tipo, la declaración de alcance todavía tiene que suceder (es por eso que tenemos var en el segundo caso) pero no se necesita información delante de los argumentos.

Cuestiones relacionadas