javascript正确的样式避免嵌套函数

时间:2014-09-28 09:56:25

标签: 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传递imageURI 然后,如果window.requestFileSystem成功调用onSuccessFS 这里出现了我的问题 由于我在onSuccessFS中需要imageURI,因此我在onSuccess中嵌入了onSuccessFS。我认为这是要避免的,但是如果我在onSuccess之外写了onSuccessFS,那么变量imageURI就超出了它的范围。
请只关注javascript。

2 个答案:

答案 0 :(得分:0)

  

我认为这是要避免的事情

不,不是。 JavaScript批准了这种风格,你有时会在完全编写好的代码中找到非常深层次的嵌套函数。

与其他语言相比,JavaScript唯一的范围设备是函数,因此函数通常用于封装。

  

但如果我在onSuccess之外写了onSuccessFS,那么变量imageURI就超出了它的范围。

好吧,这几乎强制你使用一个闭包。试图避免它只会使一切变得复杂。

答案 1 :(得分: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将包含在一个更简单的接口中。