これはクレイジーで絶対にお勧めできません。関数のコピーを作成し、関数本体を変更して使用しますeval
function returnProxy(func,args) {
var returnFlag = Math.random()+"";
// create new function based on passed function body
var fullFuncBody = func.toString();
var tmpFuncStr = "function "+ fullFuncBody.substr(fullFuncBody.indexOf("("));
tmpFuncStr = tmpFuncStr.substr(0,tmpFuncStr.length-1)+"\nreturn '"+returnFlag+"'}";
var tmpFunc;
eval("tmpFunc = "+tmpFuncStr); // really bad things
var funcOut = tmpFunc.apply(this,args);
return {
out: (funcOut == returnFlag) ? undefined : funcOut,
returned: (returnFlag != funcOut)
}
}
あなたがこのような機能を持っていると仮定すると、
function someFunction(action) {
switch(action) {
case 1:
return undefined;
case 2:
return "hello";
}
}
次のようなプロキシ機能を使用します。
returnProxy(someFunction,[1]); // instead of calling someFunction(1)
最初のパラメーターは関数自体であり、2番目のパラメーターはパラメーターの配列です。
戻り値は、2つのプロパティを持つオブジェクトでありout
、関数の結果を含み、returned
関数が返されたかどうかを示すブール値です。
出力例、
returnProxy(someFunction,[1]); // {out: undefined, returned: true}
returnProxy(someFunction,[2]); // {out: "hello", returned: true}
returnProxy(someFunction,[3]); // {out: undefined, returned: false}