简体   繁体   English

javascript如何创建参考

[英]javascript how to create reference

Could you propose any workarounds to implement a reference to variable using closures or any other tricks?您能否提出任何解决方法来使用闭包或任何其他技巧来实现对变量的引用?

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

What about passing context as first argument and pass variable name (as string) and later somehow evaluate that reference in predefined context.如何将上下文作为第一个参数传递并传递变量名(作为字符串),然后以某种方式在预定义的上下文中评估该引用。 Is this feasible?这可行吗?

Here's a more complete scenario:这是一个更完整的场景:

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

You have to use a string of the variable name but I think this is as close as you'll ever get in JavaScript:您必须使用变量名称的字符串,但我认为这与您在 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:编辑:

In your updated scenario it would be better to use a closure directly, so that you don't have to use a string of the variable name:在您更新的场景中,最好直接使用闭包,这样您就不必使用变量名的字符串:

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, you can't pass primitive values (numbers, strings, etc) by reference.在 JavaScript 中,您不能通过引用传递原始值(数字、字符串等)。 However, every object you pass will always be by reference.但是,您传递的每个 object 都将始终作为参考。 (this includes arrays) (这包括数组)

To use your example:要使用您的示例:

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

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

foo.x = 6;

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

You can't just promote x to be a reference.您不能仅仅将x推广为参考。

Only non-scalar types can be passed as reference, and will always be passed as reference:只有非标量类型可以作为引用传递,并且总是作为引用传递:

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

Closer to your example:更接近您的示例:

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

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

Since objects will always be a static reference, you can do this:由于对象将始终是 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