如果您希望在函數的開頭髮生某些事情,可以使用以下方法。你可以訪問this
和你注入函數的參數。所以它仍然適用於需要特定上下文的功能。
function inject(before, fn) {
return function(){
before.apply(this, arguments);
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);
JSfiddle
調試,你不能修改源代碼的網站時,這是很方便的,我不會用它做參數檢查,除非你可以將它剝離爲生產版本。
我真的懷疑你是否可以「插入」行到一個函數。但是,當然,您可以在調用'getRandomInteger(..)'之前將該函數封裝在另一個調用'checkParameterTypes(..)'的函數中。 – SuperSaiyan 2013-04-25 03:29:59
@Thrustmaster,你肯定*可以*通過獲取函數的代碼,插入一行並重新定義它來插入一行。但你爲什麼想要?正如你所建議的那樣,鴨子打孔就是這樣做的方法。 – Brad 2013-04-25 03:33:23
@Brad eval' /'Function'構造函數會在全局範圍內評估它,但是無法訪問所有局部變量。當然,對於一些用例來說可能就足夠了,但並不理想。 – 2013-04-25 03:34:12