Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: MaxiGanar en 23 Julio 2015, 19:21 pm



Título: [Resuelto] Ayuda, para un ejercicio de javascript para la facultad.
Publicado por: MaxiGanar en 23 Julio 2015, 19:21 pm
Hola gente del elhacker.net, mi nombre es Maxi y soy estudiante de ingenieria en sistemas, necesito su ayuda en un ejercicio de javascript.

El ejercicio consiste, en que me dan un codigo, y yo tengo que decir, que numero/s va a aprecer por pantalla.

el codigo es el siguiente.

Código
  1. <html>
  2.      <head>
  3.           <title>hola mundo</title>
  4.           <script language="javascript">
  5.  
  6.        {
  7.           M1(3);        
  8.           var x = 1;
  9.           alert(x);
  10.           }
  11.           function M1(t,r){
  12.                   if (1<t){
  13.                    var x = 1;
  14.                    M1 (t-1 , M2);        
  15.                    }
  16.                    else {
  17.                         r(t+1);
  18.                         }
  19.  
  20.           function M2(y){
  21.                    x= t + y;
  22.                    }
  23.                    alert (x);
  24.                    }
  25.  
  26.           </script>
  27.      </head>
  28.  
  29.      <body>
  30.  
  31.      </body>
  32. </html>
     

Necesito que me ayuden, como PASO A PASO, se van creando las variables y como van teniendo dicho valor, por que me pierdo mucho en el momento que se llaman las subrutinas. (por cierto me olvide mencionar, que pueden usar compilador para saber sus valores, pero la idea es que me expliquen como se va llegando a esos valores).

Gracias por su ayuda.

Mod: Los códigos deben ir en etiquetas GeSHi, tema movido, el título debe ser descriptivo al problema, modifícalo


Título: Re: Ayuda, para un ejercicio de javascript para la facultad.
Publicado por: engel lex en 23 Julio 2015, 19:33 pm
el código está malo... en M1, en la linea 14, se pasa M2 como una variable, pero M2 es una función, en la linea 17 es lo contrario, se para 8 como función pero r es variable, a demás M2, está incluido dentro de M1, y queda de más decir que es mala practica anidar funciones


por otro lado si usas google chrome, el te puede ayudar con eso... tiene un debugger de jscript integrado

aquí todo lo que necesitas saber sobre el
https://developer.chrome.com/devtools/docs/javascript-debugging (https://developer.chrome.com/devtools/docs/javascript-debugging)


Título: Re: Ayuda, para un ejercicio de javascript para la facultad.
Publicado por: MaxiGanar en 23 Julio 2015, 19:47 pm
Gracias por tu respuesta, pero aun que no lo creas, no hay errores. Te explico mas o menos el por que, en la linea 14, se pasa como argumento M2 como argumento ya que, se utiliza la tecnica "Subrutinas como parametros". Y este se pone en juego los 2 terminos de Vinculacion Profunda y Vinculacion Superficial. Para explicarlo mas o menos cada uno se definen asi,

Vinculacion Profunda: Vincula al ambiente de referencia, en el momento que el procedimiento se pasa como argumento.

Vinculacion Superficial: Vincula al ambiente de referencia, en el momento que el procedimiento, REALMENTE se llama.


Título: Re: Ayuda, para un ejercicio de javascript para la facultad.
Publicado por: engel lex en 23 Julio 2015, 19:51 pm
ya! pasas M2 como referencia para que r se pueda ejecutar como función, se me había pasado eso, igual con el debugger de chrome podrías ver eso claramente


Título: Re: Ayuda, para un ejercicio de javascript para la facultad.
Publicado por: MaxiGanar en 23 Julio 2015, 20:23 pm
Muchisimas gracias por la ayuda, ya entendi el ejercicio!! y lo pude resolver! =D. Saludos!.


Título: Re: Ayuda, para un ejercicio de javascript para la facultad.
Publicado por: MinusFour en 23 Julio 2015, 20:37 pm
Por partes:

Código
  1. M1(3);        
  2. var x = 1;
  3. alert(x);

Tu programa básicamente empieza por llamar M1 con el valor de 3

Código
  1. function M1(t, r) {
  2.    if (1 < t) {
  3.        var x = 1;
  4.        M1(t - 1, M2);
  5.    } else {
  6.        r(t + 1);
  7.    }
  8.  
  9.    function M2(y) {
  10.        x = t + y;
  11.    }
  12.    alert(x);
  13. }

Al llamar M1(3), caemos en el if del condicional.
Código
  1.    if (1 < t) {
  2.        var x = 1;
  3.        M1(t - 1, M2);
  4.    }

Declaras X con el valor de 1 (en el contexto de la llamada M1(3))
Se vuelve a llamar M1 con (3-1, M2) (x y t en el contexto de M2 es x, t en el contexto de M1(3), 3, 1).
Caes de nuevo en el if del condicional.
Declaras X con el valor de 1. (en el contexto de la llamada M1(2))
Se vuelve a llamar M1 con (2-1, M2) (x, t en el contexto de M2 es x, t en el contexto de M1(2), 2, 1).
Ya no caes en el if del condiciona.
Llamas a r (M2) con 2.
Código
  1.    function M2(y) {
  2.        x = t + y;
  3.    }
x (de M1(2)) es 4.
Imprimes x (no esta definida en el contexto de M1(1) ni en el contexto global).
Regresas a la llamada M1(2).
Imprimes x (4).
Regresas a la llamada M1(1).
Imprimes x (1).
Regresas a tu programa.
Defines x como 1.
Imprimes x (1).