Myk*_*ych 5 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
Run Code Online (Sandbox Code Playgroud)
如何将上下文作为第一个参数传递并传递变量名称(作为字符串),然后以某种方式在预定义的上下文中评估该引用.这可行吗?
这是一个更完整的场景:
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());
Run Code Online (Sandbox Code Playgroud)
你必须使用变量名称的字符串,但我认为这与你在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
Run Code Online (Sandbox Code Playgroud)
编辑:
在您更新的场景中,最好直接使用闭包,这样您就不必使用变量名的字符串:
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
Run Code Online (Sandbox Code Playgroud)