Добавление кода в функцию javascript программно


Я пытаюсь настроить существующую библиотеку JS без изменения исходного кода JS. Этот код загружается в несколько внешних файлов JS, к которым у меня есть доступ, и то, что я хотел бы сделать, это изменить одну из функций, содержащихся в исходном файле, без копирования и вставки всего этого во второй файл JS.
Так, например, off limits JS может иметь такую функцию:

var someFunction = function(){
    alert("done");
}

Я хотел бы иметь возможность каким-то образом добавлять или добавлять некоторый JS-код в эта функция. Причина в первую очередь в том, что в исходном неприкасаемом JS функция довольно огромна, и если этот JS когда-либо обновляется, функция, которую я перезаписываю, будет устаревшей.

Я не совсем уверен, что это возможно, но я решила проверить.

5 102

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/новая функция