2013-04-25 32 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 2013-04-25 03:29:59

+1

@Thrustmaster,你肯定*可以*通過獲取函數的代碼,插入一行並重新定義它來插入一行。但你爲什麼想要?正如你所建議的那樣,鴨子打孔就是這樣做的方法。 – Brad 2013-04-25 03:33:23

+0

@Brad eval' /'Function'構造函數會在全局範圍內評估它,但是無法訪問所有局部變量。當然,對於一些用例來說可能就足夠了,但並不理想。 – 2013-04-25 03:34:12

回答

3

如果您希望在函數的開頭髮生某些事情,可以使用以下方法。你可以訪問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

調試,你不能修改源代碼的網站時,這是很方便的,我不會用它做參數檢查,除非你可以將它剝離爲生產版本。

2

當然可以,但使用eval總是邪惡的;)

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/ – 2013-04-25 03:35:20

相關問題