javascript come creare il riferimento

Potresti proporre soluzioni alternative per implementare un riferimento a variabile utilizzando chiusure o altri trucchi?

createReference = function() { // TODO: how to implement? }; var x = 5; var refX = createReference(x); // could be any parameters needed to implement the logic x = 6; alert(refX()); // should alert 6 

Che cosa circa il passaggio di context come primo argomento e passare il nome della variabile (come string) e in seguito valutare in qualche modo quel riferimento in un context predefinito. È ansible?

Ecco uno scenario più completo:

 createReference = function(context, prop) { return function() { return context[prop]; }; }; Provider = function() { }; Provider.prototype.x = 5; Provider.prototype.getXRef = function() { return createReference(this, 'x'); }; Provider.prototype.incrementX = function() { this.x = this.x + 1; }; var provider = new Provider(); var refX = provider.getXRef(); provider.incrementX(); alert(refX()); 

Devi usare una string del nome della variabile, ma credo che questo sia più vicino quanto si otterrà mai in JavaScript:

 var createReference = function (context, prop) { return function () { return context[prop]; }; }; var x = 5; var refX = createReference(this, 'x'); x = 6; alert(refX()); // alerts 6 

Edit:

Nel tuo scenario aggiornato sarebbe meglio utilizzare una chiusura direttamente, in modo da non wherer utilizzare una string del nome della variabile:

 var createReference = function (context, func) { return function () { return func.call(context); } }; Provider = function() { }; Provider.prototype.x = 5; Provider.prototype.getXRef = function() { return createReference(this, function () { return this.x; }); // OR if you happen to be running in a // JavaScript 1.8 environment like Firefox 3+, // you can use "expression closures" for more // concise code: // return createReference(this, function () this.x); }; Provider.prototype.incrementX = function() { this.x = this.x + 1; }; var provider = new Provider(); var refX = provider.getXRef(); provider.incrementX(); alert(refX()); // alerts 6 

In JavaScript, non è ansible passare valori primitivi (numbers, stringhe, ecc.) Per riferimento. Tuttavia, each object passato sarà sempre di riferimento. (questo include gli arrays)

Per utilizzare il tuo esempio:

 var foo = { x: 5 }; var refFoo = foo; // foo.x => 5 // refFoo.x => 5 foo.x = 6; // foo.x => 6 // refFoo.x => 6 

Non puoi promuovere solo x per essere un riferimento.

Solo i tipi non scalari possono essere passati come riferimento e verranno sempre passati come riferimento:

 var reference = {}; my_function(reference); console.log(reference); // will show property - a property value function my_function(my_reference) { my_reference.property = "a property value"; } var not_a_reference = []; my_function(not_a_reference); console.log(not_a_reference); // will NOT show 'a value' function my_function() { my_reference.push("a value"); } 

Più vicino al tuo esempio:

 function show(value) { alert(value.data); } var value = { 'data': 5 }; show(value); // alerts 5 value.data = 6; show(value); // alerts 6 

Poiché gli oggetti saranno sempre un riferimento statico, è ansible:

 var o = {}; ox = 5; var oRef = o; alert(oRef.x); // -> 5 ox = 6; alert(oRef.x); // -> 6