var obj = {x : 2}; eval.call(obj, 'x'); // 引用错误:x未定义 如何更改最后一行以通过变量名获取值?
澄清
“x” - 在某个obj上下文中的任何表达式,可能不是obj参数
原始问题
/**
* Guards 'this' when delegating method as a callback to others. Arguments aren't known beforehand and will be provided by consumer.
*/
delegate = function(context, func) {
return function() {
var args = [];
for ( var i = 0; i < arguments.length; i++)
args.push(arguments[i]);
func.apply(context, args);
};
};
reference = function (context, 'expression to evaluete to get reference value') {
... TODO
};
'delegate' - 委托函数调用,如何“委托引用”并在不同的上下文中“取消引用”?
更新
有两种使用eval的可能性:
1. eval.call(null, '在全局上下文中评估表达式');
2. eval('在调用eval函数的上下文中评估表达式')
3. 如何在一些预定义的“上下文”中进行评估?
我想要模仿C++引用,当你可以将它放置在任何上下文中并且“取消引用”以获得值(但是在您取消引用它时,值可能已更改,您应该获得新值)。就像在javascript中,您将对象作为函数参数放置,随时获取obj.someproperty即可获取最新的someproperty值(如果已更改)。但是,当您尝试传递原始类型或整个对象被其他内容更改时,这将无法正常工作。如何将对“整个对象”的“引用”传递给其他上下文?
我清楚地了解了我想要什么 :)
javascript如何创建引用
我所寻找的内容:
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());
感谢Brianpeiris!
obj.x
和obj['x']
有什么问题? - Felix Klingeval
更好的方法。 - T.J. Crowderdelegate
函数似乎完全不相关,因为它从未调用reference
。reference
函数未提供足够的信息来解释为什么下面的几个答案都不是您要寻找的内容。 - T.J. Crowder