簡體   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