javascript如何创建引用

时间:2011-04-28 19:24:48

标签: 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(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());

5 个答案:

答案 0 :(得分:5)

你必须使用变量名的字符串,但我认为这与你在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

答案 1 :(得分:3)

在JavaScript中,您无法通过引用传递原始值(数字,字符串等)。但是,您传递的每个对象始终都是通过引用。 (这包括数组)

使用您的示例:

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

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

foo.x = 6;

// foo.x => 6
// refFoo.x => 6

答案 2 :(得分:0)

您不能只宣传x作为参考。

答案 3 :(得分:0)

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

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");
}

更接近你的例子:

function show(value) {
    alert(value.data);
}

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

答案 4 :(得分:0)

由于对象始终是静态引用,因此您可以这样做:

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