Domanda

Ho un file principale JavaScript che è racchiuso da una chiusura immediatamente chiamata (in modo da non inquinare "Global":

(function () {
"use strict";
   var closureVariable = [];
...
}());
.

Ho fatto un semplice errore di codifica intestato osseo quando si rimuove una variabile da un'intestazione della funzione tale che il mio codice avesse una virgola invece di un punto e virgola:

function fred () {
    var i,

    closureVariable = [1,2,3,4];
    confused();
}
function confused () {
    console.log(closureVariable);     // Prints '[]'
}
.

Certamente il punto e virgola mancante sulla linea 'VAR I' è stato il problema.Tuttavia, il comportamento che pensavo dovrebbe accadere è che la mia variabile definita ora locale "closevariable" dovrebbe avere ombreggiato la definizione dell'ambito del livello superiore e il valore della mia variabile definita localmente avrebbe dovuto essere disponibile alle funzioni più in basso nella catena dell'ambito (cioè, la funzione 'confusa' dovrebbe essere stampata "[1,2,3,4] ';

Cosa non capisco delle catene JavaScript Scope qui?

È stato utile?

Soluzione

Cosa ti aspetti è noto come Dynamic Scoping .Questa è una scelta di design linguistica valida, sebbene ampiamente considerata inferiore oggi.Non è proprio quello che fa JavaScript.Come molte lingue popolari, JavaScript utilizza Scoping lessicale .Ciò significa che l'ambito di confused non è considerato una portata di figlio di fred, perché la sua definizione non è all'interno della definizione di fred.Il fatto che fred chiama confused non ha alcun effetto.

Altri suggerimenti

var i,

    closureVariable = [1,2,3,4];
.

Fa due nuove variabili, disponibili nella funzione fred e nelle funzioni definite in questo ambito.

Quelle variabili sono totalmente diverse da qualsiasi variabile definita al di fuori dell'ambito fred, anche se capita di avere lo stesso nome.

Shadowing, qui, significa che la variabile denominata "closureVariable" previene qualsiasi accesso diretto alla variabile con lo stesso nome nell'ambito esterno.

Quando hai ridefinito il clipurevariable omettendo il punto e virgola è stato ridefinito solo nel contesto della funzione Fred.La funzione confusa esiste nel contesto della tua chiusura, quindi vede ancora l'originale chiusurabilità.Se avessi la tua funzione confusa definita all'interno della funzione Fred vedrebbe il nuovo closevariabile e sarebbe stampato [1,2,3,4]

(function () {
  "use strict";
  var closureVariable = [];
  function fred () {
   var i,

   closureVariable = [1,2,3,4];

   function confused () {
      console.log(closureVariable);     
   }

   confused();  // print [1,2,3,4]
  }
 })();
.

o se vuoi chiamare confuso dall'esterno di Fred ()

(function () {
  "use strict";
  var closureVariable = [];
  var confused;

  function fred () {
   var i,

   closureVariable = [1,2,3,4];

   confused = function () {
      console.log(closureVariable);     
   }  
  }

  confused();  // print [1,2,3,4]
 })();
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top