2013-04-25 2 views
2

JavaScript에서는 이미 존재하는 함수에 행을 삽입 할 수 있습니까? 예를 들어JavaScript에서 함수에 행 삽입

function insertLine(theFunction, lineToInsert, positionToInsert){ 
    //insert a line into the function after the specified line number  
} 

, 프로그램이 함수의 첫 번째 행 앞에 선 checkParameterTypes(min, "string", max, "string");를 삽입 할 수있을 것이다 : 나는 함수의 특정 위치에 선을 삽입하는 기능을 만들려면?

function getRandomInteger(min, max) { 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
} 
+3

함수에 줄을 "삽입"할 수 있는지 정말 의심 스럽습니다. 그러나 확실히, 당신은'getRandomInteger (..)'를 호출하기 전에'checkParameterTypes (..)'를 호출하는 다른 함수로 그 함수를 감쌀 수 있습니다. – SuperSaiyan

+1

@Thrustmaster, 당신은 분명히 함수의 코드를 가져 와서 코드를 삽입하고 다시 정의함으로써 라인을 삽입 할 수 있습니다. 그런데 왜 너는하고 싶니? 당신이 제안한대로, 오리 펀치는 이것을하는 방법입니다. – Brad

+0

@Brad'eval' /'Function' 생성자는 전역 범위에서 그것을 평가할 것입니다, 모든 지역 변수에 대한 접근을 잃습니다. 물론 일부 사용 사례에서는 충분하지만 이상적이지는 않습니다. –

답변

3

기능 시작 부분에 문제가 발생하면 다음을 사용할 수 있습니다. this에 액세스 할 수 있고 주입 된 함수의 인수를 사용할 수 있습니다. 따라서 특정 컨텍스트가 필요한 함수에 대해서는 여전히 작동합니다. 소스 코드를 수정할 수있는 웹 사이트를 디버깅 할 때 예를

function add(a, b) { 
    return a + b; 
}  

function concat(a, b) { 
    return a + b; 
} 

/** 
* You can repeat index and type to check multiple arguments 
*/ 
function createArgumentChecker(index, type /**index, type, ... */) { 
    var originalArgs = arguments; 
    return function() { 
     for (var i=0; i < originalArgs.length; i+=2) { 
      var index = originalArgs[i], 
       requestedType = originalArgs[i+1], 
       actualType = typeof arguments[index]; 
      if (typeAtIndex != actualType) { 
       console.log("Invalid argument passed at index " + index + 
        ". Expected type " + requestedType + "but it's " + actualType); 
      } 
     } 
    } 
} 

function logArguments() { 
    console.log(this, arguments); 
} 

// Inject an argument checker 
add = inject(add, createArgumentChecker(0,"number", 1, "number")); 
concat = inject (concat, createArgumentChecker(0, "string", 1, "string")); 

// You can even do it multiple times, inject an argument logger; 
add = inject(add, logArguments); 
concat = inject(concat, logArguments); 

JSfiddle

를 들어

function inject(before, fn) { 
    return function(){ 
     before.apply(this, arguments); 
     fn.apply (this, arguments); 
    } 
} 

이 편리 할 수있다, 나는 그것이 매개 변수가없는 한 체크 할 사용하지 것이다 프로덕션 버전을 위해 스트립을 제거 할 수 있습니다.

2

예 당신이 할 수 있지만, 평가를 사용하여 항상 악)

function insertInbetween (arr, value, index) { 
    var inserted, i, newarr = []; 
    for (i = 0; i < arr.length; i++) { 
    if(i == index && !inserted) { 
     newarr[i] = value; 
     inserted = true; 
    } 
    newarr.push(arr[i]); 
    } 
    return newarr; 
} 

function test (a, b) { 
    console.log(a,b); 
} 

var fstrarr = test.toString().split('\n'); 
eval(insertInbetween(fstrarr, "console.log('injected!');", 1).join('\n')); 

편집 : 귀하의 질문에 대한 코멘트에서 언급 한 바와 같이 당신이 그렇게함으로써 범위를 잃어 버릴 수 있습니다.

+1

다음은이 코드의 데모입니다. http://jsfiddle.net/E8WCp/ –