javascript
  • function
  • 2013-02-27 128 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)); 
    
    相關問題