을, 난 그냥 추가 할 필요가 함수에 대한 참조. 인자 저장이 이미 존재하는지 테스트하고, 그렇지 않은 경우
var someFunc = function(arg1,arg2){document.write(x+'<br />'+arg1+'<br />'+arg2)};
var addRequired = function(argName, argValue, fn){
var funcString = String(fn)
var paramPattern = new RegExp ('^function\\s*\\([^\\)]*\\b'+argName+'\\b[^\\)]*\\)');
var alreadyExists= paramPattern.test(funcString);
if(!alreadyExists) {
var insertPoint1 = funcString.indexOf('(')+1;
var insertPoint2 = funcString.indexOf('{')+1;
var newFunc = funcString.slice(0,insertPoint1)+argName+',' +funcString.slice(insertPoint1, insertPoint2)+argName+' = '+argValue+';' +funcString.slice(insertPoint2);
return eval('fn = '+newFunc);
}
}
someFunc = addRequired('x', 20, someFunc);
someFunc(1,2,3);
, 출력 :
20
2
3
어쨌든, 난 원래 내가 원하는 무슨 생각을 달성 답변의 목적을 위해, 내가 함께했다
그래서 원하는 값으로 인수를 추가했습니다. 나는 이것이 이것을 달성하는 '최선의 방법'인지는 모르지만 효과가 있었다. 이 정보 추가 7/9/10을 편집
:
내가 위의 발견 나는 나의 위의 예와는 다른 상황에 적용 갔을 때 '버그'를했다 (나는 리콜을하지 않습니다 지금 벌레가 있었던 것, 그것은 몇 주 전이었다). 나는 일한 것을 생각해 냈습니다. 다음은 인수가 전달 된 함수에 대해 이미 존재하는지 확인하기 위해 어떤 종류의 검사도 수행하지 않으며, 실제로 현재 인수 자체를 취하지 않는 함수를 기대합니다 (이것은 인수를 수용하기 위해 다시 작성할 수 있습니다. 함수는 인자로, 위에서했던 것과 비슷하다). 반환 값이 함수에 전달 된 원본에 할당
var addRequired = function(thisObj, func) {
/*Here I write a string that contains additional functions to add to the
passed in function ('func' argument above). In this case, I just show
a simple addition function for the example.*/
var str = 'myAddedFunction = function(x, y) {return x+y}';
/*Here I am taking the string for that new function I want to add, and
appending the old function to it as a string after I have stripped it
of its 'function() {' at the beginning and its '}' at the end. NOTE:
If I did not care about adding a function, but just arguments, I would
have just assigned 'str' the value after the '+' sign below */
str = str + String(func).replace(/^function\s*\([^\)]*\)[\s\n]*{/, ' ').replace(/}$/, '');
/*Here I create a new function using the actual new Function declaration so
I can define my arguments, and using the new string I created that has
my new functionality in it along with the user supplied functionality*/
var newFunc = new Function('myArg1', 'myArg2', str);
/*Now I return an anonymous function that itself returns the new function
with the object that is supposed to be the 'this' of the new function
which was passed in as the 'thisObj' argument*/
return function() {return newFunc.apply(thisObj, arguments)};
}
, 그래서 :
var userFunc = function() { *do some stuff* }; //representation only
userFunc = addRequired(someObj, userFunc); //overwrite with new functionality
이 나를 수행 할 수 있습니다 무엇 사용자 쓰기가 여기에 실제로 무엇을 사용하는 간단한 레이아웃입니다 (myAddedFunction
)뿐만 아니라 내가 제공하는 매개 변수 (myArg1
, myArg2
)를 해당 기능에 액세스 할 수 있음을 미리 알고있는 기능입니다. 이것은 "내가 왜 그럴 필요가 있겠습니까?"와 같이 추상적으로 보일 수 있습니다. 그러나 작업중인 프로젝트의 경우, 사용자 기능을 사용하여 일부 작업을 수행 할 때 필자와 사용자가 필요합니다. 사용자가 제공하는 매개 변수를 기반으로합니다.
내 목적을 위해, 내가 새 변수를 만들려고했던 문자열을 전달할 필요가 없다는 것을 잊어 버렸습니다 (항상 추가 할 변수와 같습니다). 인수의 값을 만들기 위해 문자열의 배열 (아마도 배열)을 전달한 내 게시물의 첫 번째 부분에서 수행 한 작업과 비슷한 작업을 수행했을 것입니다. 그리고이를 사용하여 newFunc
을 빌드하는 데 사용했습니다.
이 새 인수와 관련하여 * someFunc *이 무엇입니까? 나는 네가하는 말을 이해하지 못한다. 보다 구체적인 예가 도움이 될 수 있습니다. – Pointy