기능 시작 부분에 문제가 발생하면 다음을 사용할 수 있습니다. 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);
}
}
이 편리 할 수있다, 나는 그것이 매개 변수가없는 한 체크 할 사용하지 것이다 프로덕션 버전을 위해 스트립을 제거 할 수 있습니다.
함수에 줄을 "삽입"할 수 있는지 정말 의심 스럽습니다. 그러나 확실히, 당신은'getRandomInteger (..)'를 호출하기 전에'checkParameterTypes (..)'를 호출하는 다른 함수로 그 함수를 감쌀 수 있습니다. – SuperSaiyan
@Thrustmaster, 당신은 분명히 함수의 코드를 가져 와서 코드를 삽입하고 다시 정의함으로써 라인을 삽입 할 수 있습니다. 그런데 왜 너는하고 싶니? 당신이 제안한대로, 오리 펀치는 이것을하는 방법입니다. – Brad
@Brad'eval' /'Function' 생성자는 전역 범위에서 그것을 평가할 것입니다, 모든 지역 변수에 대한 접근을 잃습니다. 물론 일부 사용 사례에서는 충분하지만 이상적이지는 않습니다. –