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