Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 声明对象数组时出现函数作用域问题_Javascript_Arrays_Function_Object_Scope - Fatal编程技术网

Javascript 声明对象数组时出现函数作用域问题

Javascript 声明对象数组时出现函数作用域问题,javascript,arrays,function,object,scope,Javascript,Arrays,Function,Object,Scope,这是我目前的代码,出现的一个问题是我无法使用test(),因为预设[index].name和value在其功能范围之外不可见,为了能够在其他函数中访问这两个变量,我应该如何在全局范围中声明我的对象数组 var presets = []; var index; function CreatePresetArray(AMib, AVar) { var parentpresetStringOID = snmp.getOID(AMib, AVar); var presetStringO

这是我目前的代码,出现的一个问题是我无法使用
test()
,因为
预设[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();
var预置=[];
var指数;
函数CreatePresetArray(AMib、AVar){
var parentpresetStringOID=snmp.getOID(AMib,AVar);
var presetStringOID=parentpresetStringOID;
parentpresetStringOID=parentpresetStringOID.substring(0,parentpresetStringOID.length-2);
log.error(“parentpresetStringOID为”+parentpresetStringOID);
变量预设开关={};
对于(变量i=1;i<41;i++){
预设。按下(预设开关);
试一试{
日志错误(“getNextVB=“+presetStringOID”)之前的presetStringOID;
vb=snmp.getNextVB(预设字符串);
presetStringOID=vb.oid;
日志错误(“getnextVB=“+presetStringOID”)之后的presetStringOID;
var presetStringVal=snmp.get(presetStringOID);
日志错误(“presetStringVal=“+presetStringVal”);
指数=i-1;
预设[索引]。名称=预设字符串;
预设[索引]。值=预设字符串值;
log.error(“位置[“+index+”]处的预置数组的OID为“+presets[index].name+”,存储的值为“+presets[index].value”);
//log.error(“预设数组值[“+index+”]=“+presets[index].configs”);
如果(presetStringOID.indexOf(parentpresetStringOID)!=0){
打破
}
}接住{
log.error(“无法加载预设数组”+索引);
};
};
}
CreatePresetArray(presetMib,“presetString”);
功能测试(){
对于(i=1;i<41;i++){
log.error(“测试”+预设[索引]。名称+“”+预设[索引]。值);
};
}
test();

函数
测试中的
for
循环在
i
上迭代,但在循环内部使用
索引。也许你想用

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);
}

我马上想到两个选择:

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

如果可以避免的话,通常认为声明全局变量是不好的。污染名称空间。

请粘贴您提到的代码慢慢来,每行代码至少缩进4个字符。。。你也可以发布一个链接到jsfiddle.net/或codepen.ioWhere以及如何准确调用函数
CreatePresetArray
?这意味着“如果你根本不调用它,那就是问题所在”):-)谢谢,我试着用I代替index,但它仍然看不到数组预设的.name和.value,因为它只在函数createpresetArrayNo中声明,所以它不是。您在函数之前声明了它。这应该足够了,如果您在调用
test()
之前调用函数
CreatePresetArray
,我在调用test()之前尝试调用CreatePresetArray,当我编译时,错误显示无法从未定义中读取属性“name”,请使用我编辑的代码重试,这个错误可能只出现在最后一次迭代中谢谢你Paul,我试过使用你的代码,但仍然没有成功,它给出了与以前相同的错误。
presets
var
d,在
CreatePresetArray
声明之前。事情是根据我被告知的,我假设要创建两个不同的函数,第一个是createpresetArray,第二个是假设能够引用我通过给它一个索引创建的数组,这意味着这两个函数不应该包装在包装器中,我还被告知,引用我创建的数组的第二个函数不应该将数组作为参数,而只是一个索引。
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);
            }
        }
    }
}