javascript - una - ¿Está usando ''var'' para declarar variables opcionales?
retornar valor de una funcion javascript (14)
Esta pregunta ya tiene una respuesta aquí:
¿Es "var" opcional?
myObj = 1;
igual que ?
var myObj = 1;
Encontré que ambos funcionan desde mi prueba, asumo que var
es opcional. ¿Está bien?
Acabo de encontrar la respuesta de un foro recomendado por uno de mis colegas. Si declara una variable fuera de una función, siempre es global. No importa si utiliza la palabra clave var o no. Pero, si declara la variable dentro de una función, tiene una gran diferencia. Dentro de una función, si declara la variable usando la palabra clave var, será local, pero si declara la variable sin la palabra clave var, será global. Puede sobrescribir tus variables previamente declaradas. - Vea más en: http://forum.webdeveloperszone.com/question/what-is-the-difference-between-using-var-keyword-or-not-using-var-during-variable-declaration/#sthash.xNnLrwc3.dpuf
Considere esta pregunta formulada en hoy:
Una buena prueba y un ejemplo práctico es lo que sucede en el escenario anterior ...
El desarrollador usó el nombre de la función JavaScript en una de sus variables.
¿Cuál es el problema con el código?
El código solo funciona la primera vez que el usuario hace clic en el botón.
¿Cual es la solución?
Agregue la palabra clave var
antes del nombre de la variable.
Echa un vistazo a este Fiddle: jsfiddle.net/GWr6Z/2
function doMe(){
a = "123"; // will be global
var b = "321"; // local to doMe
alert("a:"+a+" -- b:"+b);
b = "something else"; // still local (not global)
alert("a:"+a+" -- b:"+b);
};
doMe()
alert("a:"+a+" -- b:"+b); // `b` will not be defined, check console.log
Esta es una de las partes difíciles de Javascript, pero también una de sus características principales. Una variable declarada con var
"comienza su vida" justo donde la declara. Si omite la var
, es como si estuviera hablando de una variable que ha usado antes.
var foo = ''first time use'';
foo = ''second time use'';
Con respecto al alcance, no es cierto que las variables se vuelvan automáticamente globales. En su lugar, Javascript atravesará la cadena de alcance para ver si ha usado la variable anteriormente. Si encuentra una instancia de una variable del mismo nombre que se usó antes, usará eso y el alcance en el que se declaró. Si no encuentra la variable en cualquier lugar, eventualmente llegará al objeto global ( window
en un navegador). ) y le adjuntaremos la variable.
var foo = "I''m global";
var bar = "So am I";
function () {
var foo = "I''m local, the previous ''foo'' didn''t notice a thing";
var baz = "I''m local, too";
function () {
var foo = "I''m even more local, all three ''foos'' have different values";
baz = "I just changed ''baz'' one scope higher, but it''s still not global";
bar = "I just changed the global ''bar'' variable";
xyz = "I just created a new global variable";
}
}
Este comportamiento es realmente poderoso cuando se usa con funciones anidadas y devoluciones de llamada. Aprender qué son las functions
y cómo funciona el alcance es lo más importante en Javascript.
Hay tanta confusión en torno a este tema, y ninguna de las respuestas existentes cubre todo de manera clara y directa. Aquí hay algunos ejemplos con comentarios en línea.
//this is a declaration
var foo;
//this is an assignment
bar = 3;
//this is a declaration and an assignment
var dual = 5;
Una declaración establece una bandera DontDelete. Una tarea no lo hace.
Una declaración vincula esa variable al alcance actual.
Una variable asignada pero no declarada buscará un ámbito para adjuntarse. Eso significa que atravesará la cadena alimenticia del alcance hasta que se encuentre una variable con el mismo nombre. Si no se encuentra ninguno, se adjuntará al ámbito de nivel superior (que comúnmente se conoce como global).
function example(){
//is a member of the scope defined by the function example
var foo;
//this function is also part of the scope of the function example
var bar = function(){
foo = 12; // traverses scope and assigns example.foo to 12
}
}
function something_different(){
foo = 15; // traverses scope and assigns global.foo to 15
}
Para una descripción muy clara de lo que está sucediendo, este análisis de la función de eliminación cubre la instanciación variable y la asignación extensivamente.
Hay un poco más que solo local vs global. Las variables globales creadas con var
son diferentes a las creadas sin. Considera esto:
var foo = 1; // declared properly
bar = 2; // implied global
window.baz = 3; // global via window object
Según las respuestas hasta ahora, estas variables globales, foo
, bar
y baz
son todas equivalentes. Este no es el caso. A las variables globales creadas con var
les asigna (correctamente) la propiedad interna [[DontDelete]]
, por lo que no se pueden eliminar.
delete foo; // false
delete bar; // true
delete baz; // true
foo; // 1
bar; // ReferenceError
baz; // ReferenceError
Es por esto que siempre debe usar var
, incluso para variables globales.
La palabra clave var en Javascript está ahí por un propósito.
Si declara una variable sin la palabra clave var, así:
myVar = 100;
Se convierte en una variable global a la que se puede acceder desde cualquier parte de su script. Si no lo hizo intencionalmente o no lo sabe, puede causarle dolor si reutiliza el nombre de la variable en otro lugar de su javascript.
Si declara la variable con la palabra clave var, así:
var myVar = 100;
Es local para el alcance ({] - llaves, función, archivo, dependiendo de dónde lo colocó).
Esta es una forma más segura de tratar las variables. Entonces, a menos que lo haga a propósito, intente declarar variable con la palabra clave var y no sin.
No, no es "obligatorio", pero podría serlo ya que puede causar problemas importantes en el futuro si no lo hace. No definir una variable con var ponga esa variable dentro del alcance de la parte del código en el que se encuentra. Si no lo hace, no está incluido en ese alcance y puede sobrescribir las variables previamente definidas con el mismo nombre que están fuera del alcance. de la función en la que estás.
No, no son equivalentes.
Con myObj = 1;
estás utilizando una variable global.
La última declaración crea una variable local para el alcance que está utilizando.
Pruebe el siguiente código para entender las diferencias:
external = 5;
function firsttry() {
var external = 6;
alert("first Try: " + external);
}
function secondtry() {
external = 7;
alert("second Try: " + external);
}
alert(external); // Prints 5
firsttry(); // Prints 6
alert(external); // Prints 5
secondtry(); // Prints 7
alert(external); // Prints 7
La segunda función altera el valor de la variable global "externa", pero la primera función no lo hace.
Significan cosas diferentes. Si usa var
la variable se declara dentro del alcance en el que se encuentra (por ejemplo, de la función). Si no usa var
, la variable se eleva a través de las capas de alcance hasta que encuentra una variable con el nombre dado o el objeto global (ventana, si lo está haciendo en el navegador), donde luego se adjunta. Entonces es muy similar a una variable global. Sin embargo, todavía se puede eliminar con delete
(lo más probable es que el código de otra persona no haya podido usar var
). Si usa var
en el ámbito global, la variable es verdaderamente global y no se puede eliminar.
Este es, en mi opinión, uno de los problemas más peligrosos con javascript, y debería estar en desuso, o al menos generar advertencias sobre las advertencias. La razón es que es fácil olvidar var
y tener por accidente un nombre de variable común vinculado al objeto global. Esto produce un comportamiento extraño y difícil de depurar.
Todo lo relacionado con el alcance a un lado, se pueden utilizar de manera diferente.
console.out(var myObj=1);
//SyntaxError: Unexpected token var
console.out(myObj=1);
//1
Algo algo afirmación vs expresión
Las variables no declaradas (sin var
) se tratan como propiedades del objeto global. (Por lo general, el objeto de la window
, a menos que estés en un bloque with
)
Las variables declaradas con var
son variables locales normales y no son visibles fuera de la función en la que están declaradas. (Tenga en cuenta que Javascript no tiene un ámbito de bloque)
var
es opcional. var
pone una variable en el ámbito local. Si una variable se define sin var
, está en el alcance global y no se puede eliminar .
editar
Pensé que la parte no eliminable era cierta en algún momento en un entorno determinado. Debo haberlo soñado.
Var no te permite, el programador, declarar una variable porque Javascript no tiene variables. Javascript tiene objetos. Var declara un nombre a un objeto indefinido, explícitamente. La asignación asigna un nombre como identificador a un objeto al que se le ha asignado un valor.
Usar var le dice al intérprete Javacript dos cosas:
- no utilizar el valor de búsqueda inversa de recorrido inverso para el nombre, en lugar de usar este
- no borrar el nombre
La omisión de var le dice al intérprete Javacript que use la primera instancia anterior de un objeto encontrado con el mismo nombre.
Var como palabra clave surgió de una mala decisión del diseñador de idiomas, de la misma manera que Javascript como nombre surgió de una mala decisión.
PD. Estudia los ejemplos de código de arriba.