Почему динамическое изменение кода функции JavaScript в середине выполнения - это плохо? - PullRequest
1 голос
/ 28 января 2009

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

<script>
var display = function(msg)
 {
alert(msg);
 }

// Now, at the moment, the display() function
// is receiving a single parameter and alerting
// it to the user. I'm now going to use eval()
// to modify the display() function.

eval('display = ' + display.toString().replace('alert(', 'document.write('));

// Now, the display() function writes its parameter
// to the document as opposed to alerting it.
</script>

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

Ответы [ 4 ]

8 голосов
/ 28 января 2009

Хотя это может делать то, что вам нужно, через 6 месяцев вы (или человек, поддерживающий ваш код) будете «WTF?!»

Если ваш сценарий использования - оповещение или запись на основе какого-либо условия, почему бы вам не написать две разные функции? Или пусть ваша функция принимает другой параметр, который определяет режим вывода. Или передать функцию в качестве параметра, который выполняет фактический вывод. Что-то, знаете ли, еще немного на вменяемой стороне. ; -)

5 голосов
/ 28 января 2009

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

function makeDisplay(displayStrategy) {
    return function(msg) {
        // I'm assuming you would do some additional processing here...

        displayStrategy(msg);
    }
}

var display = makeDisplay(alert);

// now modify display to use document.write
display = makeDisplay(function(msg) { document.write(msg); });
0 голосов
/ 05 февраля 2014

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

0 голосов
/ 28 января 2009

Что ж, использование eval может быть проблемой безопасности, но изменение функции в режиме реального времени - это нормально. Как еще вы можете сделать памятку в любом случае?

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

...