2014-01-06 2 views
1

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

foo=function(a,b){ 
    ...do something1... 
    foo=_foo; 
} 
_foo=function(a,b){ 
    ...do something2... 
} 

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

+1

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

+0

Обычно я использую статическую переменную (свойство) как флаг для обработки сценариев «первый раз» –

+1

Почти всегда плохо. В тот же день мы будем писать самомодифицирующийся код для систем с ограниченными ресурсами, которых ваш браузер не один. Даже воспоминание не очень хорошее оправдание, ИМО, но это не технические дебаты. –

ответ

1

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

function firstTimeFoo() { 
    ..... 
    foo = normalFoo 
} 

function normalFoo() { 
    ... 
} 

foo = firstTimeFoo