1

这是我目前拥有的代码,正在发生的一个问题是我无法使用test(),因为presets[index].name并且value在它们的函数范围之外不可见,我应该如何在全局范围内声明我的对象数组以便我能够访问这两个变量在其他函数中?

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();
4

2 回答 2

2

for函数中的test循环迭代iindex在循环内部使用。也许你打算使用

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);
            }
        }
    }
}
于 2013-10-22T19:31:05.290 回答
1

立即想到两个选项:

  • 您可以将预设数组作为参数传递给 test()。
  • 您可以将 CreatePresetArray() 和 test() 都放在包装器函数中,并在包装​​器顶部声明预设数组。这将使他们都可以访问该变量。

如果可以避免,通常认为声明全局变量是错误的形式。污染命名空间。

于 2013-10-22T19:38:17.260 回答