我試圖創建一個函數,該函數可以創建一個圍繞對象方法的「代理」。這個「代理」將用於處理Web請求,然後調用目標方法。代理功能類似於這樣:動態引用函數時的Javascript變量範圍
var proxy = function(c) {
var proxy = {};
for(var member in c) {
var args = c[member].toString().match (/function\s*\w*\s*\((.*?)\)/)[1].split (/\s*,\s*/);
proxy[member] = function(params) {
var methodArgs = args.map(function(argName) {
return params[argName];
});
return c[member].apply(c, methodArgs);
}
}
return proxy;
};
所以,如果我有這樣的原始控制器,
var c = {
sum: function(x, y) {
return x + y;
},
multiply: function(x, y) {
return x * y;
}
};
呼叫代理(c)就這樣將返回總和(代理對象)和繁殖()功能。但是,由於proxy()函數中member
變量的範圍,它將始終調用c中的最後一個引用函數 - 在本例中爲multiply()。
var cProxy = proxy(c);
//this should call c.sum, but instead calls c.multiply
cProxy.sum({
x: 3,
y: 8
});
我該如何引用proxy()函數中的正確函數,以便調用正確的方法?
封閉爲什麼你不只是做'代理[員] = C [員]'? – Markasoftware 2014-11-09 00:47:32
上面的代碼被簡化了。在實際的實現中,代理會在調用c中的原始方法之前處理web請求並處理請求數據,因此這是不可能的。如下面的答案中所示,我能夠使用閉包來工作。 – subeeshb 2014-11-09 18:10:51