Добавление кода в функцию javascript программно
Я пытаюсь настроить существующую библиотеку JS без изменения исходного кода JS. Этот код загружается в несколько внешних файлов JS, к которым у меня есть доступ, и то, что я хотел бы сделать, это изменить одну из функций, содержащихся в исходном файле, без копирования и вставки всего этого во второй файл JS.
Так, например, off limits JS может иметь такую функцию:
var someFunction = function(){
alert("done");
}
Я хотел бы иметь возможность каким-то образом добавлять или добавлять некоторый JS-код в эта функция. Причина в первую очередь в том, что в исходном неприкасаемом JS функция довольно огромна, и если этот JS когда-либо обновляется, функция, которую я перезаписываю, будет устаревшей.
Я не совсем уверен, что это возможно, но я решила проверить.
5 ответов:
если
someFunction
глобально доступен, то вы можете кэшировать функцию, создать свой собственный, и ваш вызов его.так что если это оригинал...
someFunction = function() { alert("done"); }
вы бы это сделали...
someFunction = (function() { var cached_function = someFunction; return function() { // your code var result = cached_function.apply(this, arguments); // use .apply() to call it // more of your code return result; }; })();
обратите внимание, что я использую
.apply
для вызова функции кэширование. Это позволяет мне сохранить ожидаемое значениеthis
, и передать все аргументы были приняты в качестве отдельных аргументов, независимо от того, как их было много.
сначала сохраните фактическую функцию в переменной..
var oldFunction = someFunction;
затем задайте свои:
someFunction = function(){ // do something before oldFunction(); // do something after };
вы можете создать функцию, которая вызывает ваш код, а затем вызывает функцию.
var old_someFunction = someFunction; someFunction = function(){ alert('Hello'); old_someFunction(); alert('Goodbye'); }
Я не знаю, можно ли обновить функцию, но в зависимости от того, как на нее ссылаются, вы можете сделать новую функцию на ее месте:
var the_old_function = someFunction; someFunction = function () { /* ..My new code... */ the_old_function(); /* ..More of my new code.. */ }
также. Если вы хотите изменить локальный контекст, вы должны воссоздать функцию. Например:
var t = function() { var a = 1; }; var z = function() { console.log(a); };
теперь
z() // => log: undefined
затем
var ts = t.toString(), zs = z.toString(); ts = ts.slice(ts.indexOf("{") + 1, ts.lastIndexOf("}")); zs = zs.slice(zs.indexOf("{") + 1, zs.lastIndexOf("}")); var z = new Function(ts + "\n" + zs);
и
z() // => log: 1
но это только самый простой пример. Это займет еще много работы для обработки аргументов, комментариев и возвращаемого значения. Кроме того, есть еще много подводных камней.
toString/slice/indexOf | lastIndexOf/новая функция