5

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;
}
4

2 に答える 2

5

関数の開始時に何かを発生させたい場合は、次を使用できます。this注入された関数からの引数にアクセスできます。そのため、特定のコンテキストを必要とする関数に対しては引き続き機能します。

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

例えば

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);

JSフィドル

これは、ソース コードを変更できない Web サイトをデバッグする場合に便利です。本番バージョン用に削除できない限り、パラメータ チェックには使用しません。

于 2013-04-25T03:59:55.173 に答える