JavaScript: оценить функцию внутри другой функции - PullRequest
0 голосов
/ 04 марта 2012

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

function setDesiredDimensions() {
                var width = Math.min(imagesOrigWidths[currindex], desiredWidthLimit);
                var height = Math.ceil((width / imagesOrigWidths[currindex]) * imagesOrigHeights[currindex]);

                some more calculation code here...

                return {width:width,height:height};
            }     

var size = setDesiredDimensions(imagesOrigWidths[currindex], imagesOrigHeights[currindex]);

Затем у меня есть несколько кнопок в HTML:

<a id="button1"></a>
<a id="button2"></a>
<a id="button3"></a>

и различные события нажатия на этих кнопках, например:

$('#button1').click( function() {
     currindex = (currindex+1) % max;

     **I need to evaluate setDesiredDimensions function here **

     $("#imageswap").attr({src: imgSrcBase(imagesGuids[currindex]), width: size.width, height: size.height})
});

Кнопки настраивают текущий индекс изображения в массиве, к которому мне нужно применить расчет размеров.НО: я не хочу, чтобы одна и та же функция setDesiredDimensions копировалась и вставлялась во все функции нажатия кнопок, а просто просто открываю / оцениваю ее как ярлык для более чистого кода.

Я слышал eval ();это опасно и медленно.Есть идеи?

1 Ответ

1 голос
/ 04 марта 2012

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

Я думаю, что ваша проблема в том, что функция работает с глобальными переменными, а не с передаваемыми ей аргументами. В вашем примере вы передаете imagesOrigWidths[currindex] в качестве аргумента, но также получаете доступ к imagesOrigWidths[currindex] внутри функции, что не имеет смысла.

Переопределите его так, чтобы вы могли просто передать необходимые аргументы, что-то вроде

function setDesiredDimensions(orig_width, orig_height, limit) {
    var width = Math.min(orig_width, limit);
    var height = Math.ceil((width / orig_height) * orig_height);

    // some more calculation code here...

    return {width:width,height:height};
}    
...