¿Cómo las variables están fuera del scope?

Tengo el siguiente código jquery:

$.ajax({ url: 'somefile.php', type: "POST", data: "", dataType: "json", async: false, success: function (data) { var var1 = something; var var2 = something; var var3 = something; var var4 = something; for (var i = 0; i < data.length; i++) { $('.somediv').html(''); $('.somediv').append('Somehtml'); } some_function_declanetworking_later(var1, var2, var3, var4); } 

Al comstackr recibo el error: 'var1','var2','var3' & 'var4' are used out of scope . Sin embargo, no veo ningún problema, ya que se han declarado en la misma function donde se están utilizando.

¡Por favor ayuda!

Actualización: ¿Podría esto tener algo que ver con la statement de some_function_declanetworking_later fuera de la function actual?

Actualización : la nueva versión de su pregunta la cambia por completo y hace que el error del "comstackdor" no tenga sentido. Me parece muy, muy difícil de creer que cualquier herramienta te esté dando el error que has citado del código (actualizado) que has citado, y con el debido respeto, creo que debes alimentarlo con un código diferente al que crees usted está.

El código original para el controller de success de su pregunta se veía así:

 function (data) { for (var i = 0; i < data.length; i++) { var var1 = data[i][0]; var var2 = data[i][1]; var var3 = data[i][2]; var var4 = data[i][3]; $('.somediv').html(''); $('.somediv').append('Somehtml'); } some_function_declanetworking_later(var1, var2, var3, var4); } 

… y la respuesta a continuación se refiere a ese código. Con la última versión del código en tu pregunta.

Respuesta original :

Usted ha dicho en un comentario que el "comstackdor" en cuestión es "Alguna herramienta en línea dada por mi server web".

Tienes razón, esas variables están dentro del scope. O bien la herramienta no entiende JavaScript, o alternativamente lo hace , pero está haciendo la cosa "pelusa" de ser más restrictivo que el lenguaje. jslint , por ejemplo, le dará un error como ese ("No declarar variables en un bucle"). (Cuidado: jslint te da muchos "errores" que en realidad son solo la opinión de tu autor sobre cómo se deben hacer las cosas). En JavaScript, una variable declarada con var se declara a través de la function, porque JavaScript no tiene bloque (actualmente) scope, solo scope de la function y scope global. Su código de controller de success es exactamente el mismo que este:

 function (data) { var var1, var2, var3, var4; for (var i = 0; i < data.length; i++) { var1 = data[i][0]; var2 = data[i][1]; var3 = data[i][2]; var4 = data[i][3]; $('.somediv').html(''); $('.somediv').append('Somehtml'); } some_function_declanetworking_later(var1, var2, var3, var4); } 

Más en mi blog: Po pobre incomprendido

Ahora, incluso sin el error del comstackdor misterioso, este código parece bastante extraño. Está asignando y reasignando las variables en el ciclo, y luego usándolas fuera del ciclo. Por lo tanto, estarán undefined (si data.length es 0 ) o los valores de la última pasada del ciclo.


Re su edición:

¿Podría esto tener algo que ver con la statement de some_function_declanetworking_later fuera de la function actual?

No. Si el problema era que some_function_declanetworking_later no se definía a partir de esa línea de código, entonces el error se quejaría de some_function_declanetworking_later , no de los vars.

Las declaraciones de funciones, como las declaraciones var , se alzan al principio del ámbito donde aparecen. Entonces, si tienes esto más abajo:

 function some_function_declanetworking_later(a, b, c, d) { // .... } 

… estás bien (aparte del bucle raro).

Si tienes esto más abajo:

 var some_function_declanetworking_later = function(a, b, c, d) { // .... }; 

… entonces some_function_declanetworking_later se declarará a partir del código de arriba (porque var es izada), pero puede tener el valor undefined si el controller de success ejecuta antes de la línea de código asignando la function a some_function_declanetworking_later var. (Eso parece poco probable, pero no lo escribiría de esa manera, solo para estar seguro).