声明对象数组时的函数范围问题

时间:2013-10-22 19:23:04

标签: javascript arrays function object scope

这是我目前的代码,正在发生的一个问题是我无法使用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();

2 个答案:

答案 0 :(得分: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);
            }
        }
    }
}

答案 1 :(得分:1)

立即想到两个选项:

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

如果可以避免的话,通常认为声明全局变量的Bad Form。污染命名空间。