我编写了这个有效的代码,但我没有看到嵌套函数,所以我想我可以用更好的方式编写它:
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。
答案 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将包含在一个更简单的接口中。