Advertisement
Guest User

Untitled

a guest
Feb 24th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.53 KB | None | 0 0
  1. /*
  2. 1. Prendiamo un array, in cui vogliamo inserire una funzione al cui interno inserisco:
  3. a - una funzione che ritorna un nome
  4. b - una stringa rappresentante un nome
  5. */
  6.  
  7. var array = [];
  8.  
  9. /*
  10. 2. Ipotizziamo di avere un array di nomi da cui prelevare il nome da inserire nell'array al punto 1
  11. */
  12.  
  13. var nomi = ['Marco', 'Laura', 'Assunta'];
  14.  
  15. /*
  16. 3. Creiamo un ciclo for che acceda ai nomi e:
  17. a - inserisca una funzione che ritorna il nome i-esimo del ciclo
  18. b - inserisca una stringa rappresentante il nome i-esimo del ciclo
  19. */
  20.  
  21. for(var i = 0; i < 3; i++){
  22. // Punto a
  23. array.push(function(){
  24. var nome = nomi[i];
  25. return nome;
  26. });
  27. // Punto b
  28. array.push(nomi[i]);
  29. }
  30.  
  31. /*
  32. 4. Utilizzo il forEach (metodo di Array) per accedere ai valori del mio array,
  33. facendo attenzione se sto esaminando un elemento puntuale (stringa) o una funzione e ne
  34. stampo il valore. Faccio uso dell'operatore ternario: condizione ? true : false;
  35. */
  36.  
  37. array.forEach(function(elem){
  38. typeof elem === 'function' ? console.log(elem()) : console.log(elem);
  39. });
  40.  
  41.  
  42. /* RISULTATO */
  43. /*
  44. undefined
  45. Marco
  46.  
  47. undefined
  48. Laura
  49.  
  50. undefined
  51. Assunta
  52. */
  53.  
  54. /*
  55. Mentre il punto b funziona, in quanto il valore del nome i-esimo è catturato nell'istante i-esimo del mio ciclo for,
  56. il punto a crea una chiusura sulla funzione che inserisco nell'array che prenderà "vita" solo nel momento della sua
  57. esecuzione in cui il valore i è quello che ha assunto a fine ciclo, ovvero un valore che esce dal range della dimensione
  58. dell'array, ritornando pertanto un valore undefined.
  59. */
  60.  
  61. /* SOLUZIONI */
  62. /*
  63. // SOLUZIONE 1: utilizzo una costante. Avrò n costanti quante le iterazioni del ciclo
  64. for(var i = 0; i < 3; i++){
  65. const k = i;
  66. array.push(function(){
  67. var nome = nomi[k];
  68. return nome;
  69. });
  70. array.push(nomi[i]);
  71. }
  72.  
  73. // SOLUZIONE 2: utilizzo let. Let crea una variabile di scope a livello di blocco, per cui ad ogni iterazione è come se
  74. avessi una nuova i
  75. for(let i = 0; i < 3; i++){
  76. array.push(function(){
  77. var nome = nomi[i];
  78. return nome;
  79. });
  80. array.push(nomi[i]);
  81. }
  82.  
  83. // SOLUZIONE 3: creo un nuovo SCOPE grazie ad una funzione
  84.  
  85. function inserisciNome(nome){
  86. array.push(function(){
  87. return nome;
  88. });
  89. }
  90.  
  91. for(var i = 0; i < 3; i++){
  92. inserisciNome(nomi[i]);
  93. array.push(nomi[i]);
  94. }
  95.  
  96. // VARIANTE:
  97.  
  98. function inserisciNome(i){
  99. array.push(function(){
  100. return nomi[i];
  101. });
  102. }
  103.  
  104. for(var i = 0; i < 3; i++){
  105. inserisciNome(i);
  106. array.push(nomi[i]);
  107. }
  108.  
  109. // SOLUZIONE 4: Utilizzo una IIFE che crea un nuovo SCOPE
  110.  
  111. for(var i = 0; i < 3; i++){
  112. array.push((function(i){
  113. var nome = nomi[i];
  114. return nome;
  115. })(i));
  116. array.push(nomi[i]);
  117. }
  118. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement