2010-06-17 5 views
4

someFunc()이 이미 javascript에 정의되어 있고, 자체 인수 세트가 정의되어 있거나 정의되어 있지 않을 수도 있습니다. 필요한 인수를 추가하고 해당 인수를 기본값으로 설정하는 또 다른 함수를 작성할 수 있습니까? someFunc()? 뭔가 같은 :JavaScript에서 기존 함수에 인수와 기본값을 동적으로 바인딩합니다.

var someFunc = function(arg1, arg2 ...){ Do stuff...} 
var addRequired = function(argName, argValue, fn) { 
    Add the required default arg to a function... 
} 

addRequired("x", 20, someFunc); 

이제 someFunc은과 같이 대략 정의된다 :

someFunc = function(x, arg1, arg2...) { 
    x = 20; 
    Do stuff... 
} 

내가 정말 추구하고하는 것은 하는 것입니다뿐만 아니라 내가하는 이미 (함수에 값을 결합 달성 방법을 알고 있음), 다른 객체 참조를 동일한 함수에 바인드 할 수 있습니다 (함수는 미리 알 수 없으므로 사용자가 정의하지만 사용자 코드는이 두 번째 객체 참조에 액세스하여 독자적으로 사용합니다 기능). 그래서 위의 간단한 예제에서 "20"값은 실제로 객체 참조가됩니다.

도움을 주셔서 감사합니다. 이처럼

+2

이 새 인수와 관련하여 * someFunc *이 무엇입니까? 나는 네가하는 말을 이해하지 못한다. 보다 구체적인 예가 도움이 될 수 있습니다. – Pointy

답변

1

을, 난 그냥 추가 할 필요가 함수에 대한 참조. 인자 저장이 이미 존재하는지 테스트하고, 그렇지 않은 경우

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을 빌드하는 데 사용했습니다.

4

: 나는 과정에서, 나는 정말 내 목적을 위해 인수를 추가 할 필요가 없다는 것을 깨닫게되었다 비록 내가 대답을 찾을 생각

function addParameter(func, argIndex, argValue) { 
    return function() { 
     arguments[argIndex] = argValue; 
     arguments.length = Math.max(arguments.length, argIndex); 
     return func.apply(this, arguments); 
    }; 
} 

someFunc = function(x, arg1, arg2...) { 
    Do stuff... 
} 
someFunc = addParameter(someFunc, 0, someValue); 
관련 문제