2013-10-22 236 views
1

這個數組時,函數範圍的問題是,我目前擁有的代碼,一個問題發生的事情是我不能使用test()因爲presets[index].namevalue是其功能範圍的不可見的外面,我應該如何申報我的數組全局範圍內的對象爲了讓我能夠在其他函數中訪問這兩個變量?申報對象

var presets = []; 
var index; 

function CreatePresetArray(AMib, AVar) { 
    var parentpresetStringOID = snmp.getOID(AMib, AVar); 
    var presetStringOID = parentpresetStringOID; 
    parentpresetStringOID = parentpresetStringOID.substring(0, parentpresetStringOID.length - 2); 
    log.error("parentpresetStringOID is " + parentpresetStringOID); 

    var presetswitches = {}; 

    for (var i = 1; i < 41; i++) { 
     presets.push(presetswitches); 
     try { 
      log.error("presetStringOID before getNextVB= " + presetStringOID); 
      vb = snmp.getNextVB(presetStringOID); 
      presetStringOID = vb.oid; 
      log.error("presetStringOID after getnextVB= " + presetStringOID); 

      var presetStringVal = snmp.get(presetStringOID); 

      log.error("presetStringVal= " + presetStringVal); 

      index = i - 1; 

      presets[index].name = presetStringOID; 
      presets[index].value = presetStringVal; 
      log.error("preset array's OID at position [" + index + "]  is" + presets[index].name + " and the value stored is " + presets[index].value); 

      //log.error("presets Array value ["+index+"] =  "+presets[index].configs); 

      if (presetStringOID.indexOf(parentpresetStringOID) != 0) { 
       break; 
      } 

     } catch (ie) { 
      log.error("couldn't load preset array " + index); 
     }; 
    }; 
} 

CreatePresetArray(presetMib, "presetString"); 

function test() { 
    for (i = 1; i < 41; i++) { 
     log.error("test" + presets[index].name + "  " + presets[index].value); 
    }; 
} 
test(); 
+0

,請複製粘貼你提到 –

+0

把你的時間的代碼,縮進每行代碼至少4個字符...,它會工作 – devnull69

+0

您也可以將鏈接到jsfiddle.net/或codepen.io – LiavK

回答

2

for循環在你的函數test迭代i但使用index內循環。也許你想用

for (i = 0; i < 40; i++) { // 1 lower as you were using `index = i - 1` before 
    log.error("test" + presets[i].name + "  " + presets[i].value); 
} 

重新寫你的代碼。我不認爲我通過改變做了那麼多。如果這不能解決您的問題,請考慮:是否catch發生每次迭代?這個問題實際上是來自不同的方法嗎?另外,請考慮在調試時記錄整個presets陣列以查看它的外觀。

var presets = []; 

function CreatePresetArray(AMib, AVar) { 
    var parentPresetOID, presetOID, presetValue, preset, vb, i; 
    parentPresetOID = snmp.getOID(AMib, AVar); 
    presetOID = parentPresetOID; // initial 
    parentPresetOID = parentPresetOID.substring(0, parentPresetOID.length - 2); 

    log.error("parentPresetOID is " + parentPresetOID); 
    presets = []; // empty array in case not already empty 
    for (i = 0; i < 40; ++i) { 
     try { 
      preset = {}; // new object 
      // new presetOID 
      vb = snmp.getNextVB(presetOID); 
      presetOID = vb.oid; 
      log.error("presetOID after getnextVB= " + presetOID); 
      // new value 
      presetValue = snmp.get(presetOID); 
      log.error("presetValue= " + presetValue); 
      // append data to object 
      preset.name = presetOID; 
      preset.value = presetValue; 
      // append object to array 
      presets.push(preset); 
      // more logging 
      log.error(
       "preset array's OID at position [" + i + "]" + 
       "  is" + presets[i].name + " and " + 
       "the value stored is " + presets[i].value 
      ); 
      if (presetOID.indexOf(parentPresetOID) !== 0) { 
       break; 
      } 
     } catch (ie) { 
      log.error("couldn't load preset array " + i); 
      if (presets.length !== i + 1) { // enter dummy for failed item 
       presets.push(null); 
      } 
     } 
    } 
} 
+0

謝謝,我試圖用我來代替索引,但它仍然無法看到數組預設的.name和.value,因爲它只在函數中聲明瞭createpresetArray –

+0

否,事實並非如此。你在函數之前聲明它。這應該是足夠的,如果你在調用test()之前調用函數'CreatePresetArray'' – devnull69

+0

我在調用test()之前嘗試調用createpresetArray,當我編譯時,錯誤說不能從undefined讀取屬性「name」 –

1

兩個選項浮現在腦海中立刻道:

  • 你可以在預設的數組傳遞的參數測試()。
  • 您可以將CreatePresetArray()和test()放入包裝函數中,並在包裝​​的頂部聲明預置數組。這將使他們都可以訪問變量。

它通常被認爲是不良形式來聲明全局變量,如果可以避免的話。污染名稱空間。

+0

「預設」在CreatePresetArray聲明之前是'var'd。 –

+0

事情是從我被告知,我想創建兩個不同的函數,第一個是createpresetArray,第二個是假設能夠引用我創建的數組,通過給它一個索引,這意味着這兩個函數不應該被包裝在一個包裝中,我也被告知第二個引用我創建的數組的函數不應該將該數組作爲參數,而只是一個索引。 –