2014-09-28 2 views
0

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

function onSuccess(imageURI) { 
    function errorHandlerFS(e) { 
     //code managing error 
    } 

    function onSuccessFS(fs){ 
     window.resolveLocalFileSystemURL(imageURI,function(fileEntry){//here I reference the variable imageURI 
      //do something 
     }, errorHandlerFS); 
    } 

    window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, onSuccessFS, errorHandlerFS); 
} 

$('#shootImg').click(function(){ 
     cameraProp.sourceType = Camera.PictureSourceType.CAMERA; 
     navigator.camera.getPicture(onSuccess, onFail,cameraProp); 
}); 

Здесь нажмите на #shootImg активирует onSuccess проходящий образURI.
Затем, если window.requestFileSystem успешно вызывает вызовыSuccessFS.
Здесь возникает моя проблема.
Поскольку мне нужно изображениеURI в onSuccessFS, я написал onSuccessFS, вложенное внутри onSuccess. Я думаю, что этого можно избежать, но если бы я написал onSuccessFS вне onSuccess, переменная imageURI была вне ее области.
Пожалуйста, сосредоточьтесь только на javascript.

+4

Кто сказал вам избегать вложенных функций? ИМХО вышеприведенный код довольно чистый и хорошо продуманный. – 2014-09-28 10:06:21

+0

Потому что я их не вижу много ... возможно, я никогда не видел вложенных функций ... Может быть, – Ferex

+1

Возможно, вы их не видели, потому что некоторые языки их не поддерживают. В JavaScript вложенные функции часто являются отличным способом учета и структурирования логики. Далеко не встраивание 'onSuccessFS' внутри' onSuccess' является «чем-то, чего следует избегать», это правильный способ закрыть параметр «imageURI». – 2014-09-28 10:34:15

ответ

0

Я думаю, что это что-то, чтобы избежать

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

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

, но если бы я написал onSuccessFS вне onSuccess, переменная imageURI была вне ее области.

Ну, это почти заставляет вас использовать закрытие. Попытка избежать этого только усложняет все.

0

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

Альтернативой вложенности определения функций будет проходить успеха и ошибки обработчиков функций непосредственно в Params:

function onSuccess(imageURI) { 
    window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, 
     function(fs) { 
      window.resolveLocalFileSystemURL(imageURI, 
       function(fileEntry) { //here I reference the variable imageURI 
        //do something 
       }, 
       function(e) { 
        //code managing error 
       }); 
     }, 
     function(e) { 
      //code managing error 
     }); 
    } 

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

Вы можете абстрагировать логику локального хранилища в отдельный .js-модуль, который будет содержать всю логику, связанную с временным или постоянным хранилищем, и будет содержать всю обработку ошибок, связанную с хранением. Таким образом, вы упростили бы приведенный выше код, потому что локальный API хранения был бы обернут гораздо более простым интерфейсом.

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