2010-12-30 35 views
9
(function() { 
    var x = 1; 
    return { 
     f: function (x) { 
      alert(x); 
     } 
    }; 
}()).f(2); 

Supponiamo di non voler rinominare nessuna variabile. Non è possibile, dall'interno di f, accedere alla variabile x, che è stata dichiarata per prima, giusto?Accesso alla variabile nell'ambito esterno?

+1

si potrebbe esporre la variabile con un metodo – hunter

+1

Perché non si vuole rinomina una variabile? – strager

+1

Il parametro 'x' * ombreggia * la variabile' x'. Come in molti altri linguaggi di programmazione (che a volte possono essere risolti ma in questo esempio, no). –

risposta

11

corretta. Poiché hai un diverso numero in function (x), qualsiasi tentativo di accedere a x otterrà quello (l'ambito più vicino). Blocca l'accesso a qualsiasi x in un ambito più ampio.

1

Si potrebbe tornare la variabile con la funzione:

(function() { 
    var x = 1; 
    return { 
     f: function() { 
      alert(this.x); 
     }, 
     x:x 
    }; 
}()).f(); 
1

Non v'è alcun modo di, dall'interno f, accedere alla variabile x, che è stato dichiarato prima

No, non c'è. L'ambito interno x nasconde l'ambito esterno x.

var closure = (function() { 
    var local = {}; 
    local.x = 1; 
    return { 
     f: function (x) { 
      alert(x || local.x); 
     } 
    }; 
}()); 

closure.f(2); // alerts "2" 
closure.f(); // alerts "1" 

Non è possibile avere una variabile interna denominata "locale", ovviamente. ;-)

4

Ciò consente di utilizzare sia x (1) che x (2) allo stesso tempo.

(function() { 
    var x = 1; 
    return { 
     f: function (x) { 
      alert(x); // paramter (=2) 
      alert(this.x); // scoped variable (=1) 
     }, 
     x:x 
    }; 
}()).f(2); 
+0

Un approccio interessante. Grazie! Però, nel caso della vita reale, non voglio esporre quel 'x'. – feklee

0

Consapevole delle chiamate asincrone implicite che ti fanno pensare che non si può accedere di variabili dal campo di applicazione esterna:

result = {} 
jQuery.ajax({ // it is a async call! 
    url: "/some/url", 
    success: function(data) { 
     result = JSON.parse(data); 
    } 
}); 

return result; // Result will be still {} because function returns before request has done. 
Problemi correlati