繁体   English   中英

javascript如何创建参考

[英]javascript how to create 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());

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

在 JavaScript 中,您不能通过引用传递原始值(数字、字符串等)。 但是,您传递的每个 object 都将始终作为参考。 (这包括数组)

要使用您的示例:

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

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

foo.x = 6;

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

您不能仅仅将x推广为参考。

只有非标量类型可以作为引用传递,并且总是作为引用传递:

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

由于对象将始终是 static 引用,您可以这样做:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM