2015-04-25 6 views
0

У меня возникают проблемы с вызовом внутренней функции изнутри другой. Мне нужно иметь возможность вызвать funcA на загрузку страницы, передавая ему элемент и некоторые измерения, которые затем применяют некоторые стили к элементам pass. funcB затем использует элемент правильно сказал параметры для размера:Вызов частной функции изнутри другой функции

var funcA = function(elem, width, height) { 

    //performs layout restyle 
    function funcB() { 
      //performs sizing 
    } 

    funcB(); 
} 

Однако, этот вопрос я должен напомнить funcB изнутри функция изменения размера противодребезговой защиты, как это.

function debounce(func, wait, immediate) { 
    var timeout; 
    return function() { 
     var context = this, args = arguments; 
     var later = function() { 
      timeout = null; 
      if (!immediate) func.apply(context, args); 
     }; 
     var callNow = immediate && !timeout; 
     clearTimeout(timeout); 
     timeout = setTimeout(later, wait); 
     if (callNow) func.apply(context, args); 
    }; 
}; 
var resizeFn = debounce(function() { 

    funcB(); 

}, 10); 

$(window).on('resize', resizeFn); 

Какова наилучшая практика для создания funcB? Я подумывал о возврате его, а затем к его кешированию к переменной:

var funcA = function(elem, width, height) { 

    //performs layout restyle 
    function funcB() { 
      //performs sizing 
    } 

    funcB(); 

    return funcB 
} 

var scopedFuncB = funcA; 

scopedFuncB(); 

Но есть ли лучший способ?

+1

Как и где вы определяете функцию debounced resize? – Oriol

+0

, возвращая его, чтобы сформировать замыкания, звучит как жизнеспособный способ. Что вам не нравится? Пожалуйста, покажите нам весь код этой попытки. – Bergi

+0

См. Выше, это не то, что мне не нравится, это жизнеспособно, просто интересно, есть ли способ сделать это, не загрязняя глобальное пространство имен. – user3586963

ответ

0

Почему вы не делаете funcA что-то возвращать, а затем funcB делает свой материал, получая этот вывод funcA как параметр?

0

Вот два варианта:

var funcA = function(elem, width, height) { 
    if(!(this instanceof funcA)){ 
     return new funcA(elem, width, height); 
    } 
    //performs layout restyle 
    this.funcB = function() { 
      //performs sizing 
    } 
} 

funcA(elem, width, height).funcB(); 

или

var funcA = function(elem, width, height) { 
    //performs layout restyle 
    var funcB = function() { 
      //performs sizing 
    } 
    window.funcB = funcB; 

} 

funcA(elem, width, height); 
funcB(); 
1

я рассматривал возвращение его

Да, это, безусловно, лучшая практика. Таким образом, вызывающий может решить, что с ним делать, и когда и как часто это можно назвать.

... а затем кэширует его переменной

Нет необходимости в том, что на самом деле. Вы можете прямо передать его debounce без дальнейших ограничений:

$(window).on('resize', debounce(funcA(elem, width, height), 10)); 
+0

Это хорошее решение. jQuery следует добавить в вопрос как тег. – rottenoats

+0

@Grimbode: Ну, ответ будет таким же, если бы использовался 'window.addEventListener ('resize', ..., false)', поэтому не достаточно jQuery, чтобы он нуждался в теге. – Bergi

Смежные вопросы