javascript如何创建引用

javascript如何创建引用,javascript,pass-by-reference,Javascript,Pass By Reference,您是否可以提出一些解决方法来使用闭包或其他技巧实现对变量的引用 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 如何将上下文作为第一个参

您是否可以提出一些解决方法来使用闭包或其他技巧实现对变量的引用

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
如何将上下文作为第一个参数传递,并将变量名(作为字符串)传递,然后在预定义的上下文中以某种方式计算该引用。这是否可行

下面是一个更完整的场景:

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());

不能将
x
提升为引用。

在JavaScript中,不能通过引用传递基本值(数字、字符串等)。但是,您传递的每个对象都将始终是引用对象。(这包括阵列)

要使用您的示例:

var foo = { x: 5 };
var refFoo = foo;

// foo.x => 5
// refFoo.x => 5

foo.x = 6;

// foo.x => 6
// refFoo.x => 6
function show(value) {
    alert(value.data);
}

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

只有非标量类型可以作为引用传递,并且将始终作为引用传递:

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");
}
更接近您的示例:

var foo = { x: 5 };
var refFoo = foo;

// foo.x => 5
// refFoo.x => 5

foo.x = 6;

// foo.x => 6
// refFoo.x => 6
function show(value) {
    alert(value.data);
}

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

由于对象始终是静态引用,因此可以执行以下操作:

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

您必须使用变量名字符串,但我认为这是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
编辑:

在更新的场景中,最好直接使用闭包,这样就不必使用变量名字符串:

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

以后,请不要在代码中嵌入注释来提问。这会让你很难看到这个问题,你可能会让别人把它当作一个问题来回答。我很高兴我回答了你的问题,但是,在你更新的场景中,为什么不使用:
Provider.prototype.getXRef=function(){var that=this;return function(){return that.x;};}这样您就可以避免使用字符串了?createReference是制作技巧的通用方法。然后在不同的情况下,我将使用这种通用的方法。请注意:可能没有Provider.prototype.getXRef方法,但在其他方法中,我可能希望将对其他对象的引用作为回调参数传递给其他对象,等等。。。编写createReference(this,'x')然后编写函数(){var that=this;return function(){return that.x;};};};在日常使用中。我明白了。请看一下我的答案的最新编辑,以获得更通用的解决方案。我真的认为您应该避免使用字符串,但我将把它留给您:)有没有办法使用新的编号(4)
来做到这一点?那是一个物体。你能(重新)将它的值设置为“保持它的活力”并让它传播吗?类似于
n=新数字(4);n2=n;n2.设定值(7);警报(n)是,这将是一个对象。从技术上讲,JS中的所有内容都是对象。然而,标量值(数字、字符串等)根本不会通过引用传递,这只是JS的工作方式。我知道它是一个对象,但如何更改数字对象的值
.setValue
不存在,因此无法重新分配新对象,因为这样会丢失对
n
的引用。不工作:
n2=7
n2=新编号(7)
n2.设定值(7)。前两个失去参考,第三个不存在。如何更改数字对象的值?是的,很好的选择。但javascript无论如何都不是类型保存,而且在名称误用上不会出现“编译时”错误,因此我认为最好使用代码更短、可读性稍高(对我来说)的方法,而使用不带字符串的方法。