javascript
  • function
  • 2013-02-27 92 views 1 likes 
    1

    我有以下代码:访问嵌套函数在Javascript

    function getRetailerName(retailerID) { 
        var retailerName; 
        db.transaction(function retName(qry) { 
         qry.executeSql("SELECT retailerName FROM retailers WHERE token = '" + retailerID + "' ", [], function (tx, results1) { 
          var len1 = results1.rows.length; 
          var retailerName; 
          for (var i1 = 0; i1 < len1; i1++) { 
           retailerName = results1.rows.item(i1).retailerName; 
           //alert(results1.rows.item(i1).retailerName); 
          } 
         }); 
         return retailerName; 
        }); 
        alert(retName()); 
    } 
    

    我试图从内部功能retName()获得的价值,并最终调用getRetailerName()来从数据库中的值,但它一直给我retName未定义的错误?

    我在这里尝试了很多,

    +0

    你在哪里定义了'retName()'? – 2013-02-27 11:30:10

    +1

    SQL注入警报!不要在真实的数据库上运行此代码。 – Joe 2013-02-27 11:30:39

    +0

    使用一个函数,例如这个名称:'getRetailerNameByToken(token)'并将sql放在服务器上。这可以防止你从SQL INJECTION – 2013-02-27 11:33:08

    回答

    3

    ,因为它是异步的你不能那样做。当你从函数返回时,查询还没有完成。相反,传递一个回调将被执行:

    function getRetailerName(retailerID, callback) { 
        var retailerName; 
        db.transaction(function retName(qry) { 
         qry.executeSql("SELECT retailerName FROM retailers WHERE token = '" + retailerID + "' ", [], function (tx, results1) { 
          var len1 = results1.rows.length; 
          var retailerName; 
          for (var i1 = 0; i1 < len1; i1++) { 
           retailerName = results1.rows.item(i1).retailerName; 
           callback(retailerName); 
          } 
         }); 
        }); 
    } 
    
    getRetailerName(1, function(name) { 
        alert(name); 
    }); 
    
    +0

    谢谢,这有很大的帮助。 – JamesG 2013-02-27 12:02:29

    1

    你不能(因为retName命名的函数表达式只有在它里面用),你不应该这样做(因为函数是异步的,它不会工作)。相反,使用回调:

    function getRetailerName(retailerID, callback) { 
        var retailerName; 
        db.transaction(function retName(qry) { 
         qry.executeSql("SELECT retailerName FROM retailers WHERE token = '" + retailerID + "' ", [], function (tx, results1) { 
          var len1 = results1.rows.length; 
          for (var i1 = 0; i1 < len1; i1++) {; 
           callback(results1.rows.item(i1).retailerName); 
          } 
         }); 
        }); 
    } 
    
    getRetailerName(1, alert.bind(window)); 
    
    相关问题