简体   繁体   English

变量在 javascript 中突然切换到未定义

[英]Variable is suddenly switching to undefined in javascript

I marked the third console.log - "console.log(elements[i])".我标记了第三个console.log - “console.log(elements[i])”。 At that point, elements[i] is undefined, but before then it behaves as expected.那时,elements[i] 是未定义的,但在此之前它的行为与预期一样。 Any ideas how/why this is happening?任何想法如何/为什么会发生这种情况?

function get_all_tasks_within_div(div_id) {
  var options = []
  var checked_options = []
  var elements = document.getElementById(div_id).querySelectorAll('*');
  for (i = 0; i < elements.length; i++) {
    if (elements[i].getAttribute("name") == "task") {
      options.push(elements[i].value)
      if (elements[i].checked == true) {
        checked_options.push(elements[i].value)
      }
    }
  }
  return [options, checked_options]
}

function create_exhibits_list(deliverable_id) {
  exhibits[deliverable_id] = []
  var elements = document.getElementsByName("exhibit")
  //get all exibits and sort
  for (i = 0; i < elements.length; i++) {
    try {
      console.log(elements[i])
      var element_id = elements[i].id;
      var exhibit_number = document.getElementById(element_id + "exhibit_number").value;
      var exhibit_name = document.getElementById(element_id + "exhibit_name").value;
      var responsible_party = document.getElementById(element_id + "responsible_party").value;
      var deliverable_type = document.getElementById(element_id + "type").value;
      var deliverable_type_options = Array.apply(null, document.getElementById(element_id + "type").options).map(function(el) {
        return el.value;
      });
      var responsible_party_options = Array.apply(null, document.getElementById(element_id + "responsible_party").options).map(function(el) {
        return el.value;
      });
      console.log(elements[i])
      var task_data = get_all_tasks_within_div(element_id + "tasks");

      console.log(elements[i]) // *****

      var task_options = task_data[0]
      var task_checked_options = task_data[1]
      exhibits[deliverable_id].push({
        'exhibit_number': exhibit_number,
        'exhibit_name': exhibit_name,
        'responsible_party': responsible_party,
        'deliverable_type': deliverable_type,
        'deliverable_type_options': deliverable_type_options,
        'responsible_party_options': responsible_party_options,
        'task_options': task_options,
        'task_checked_options': task_checked_options,
        'exhibit_id': element_id,
        'exhibit_int': parseInt(element_id.replace(deliverable_id + "exhibit", ""), 10)
      })
    } catch (err) {
      console.log(err)
    }
  }

You use the global variable i in both functions, so the for loop in get_all_tasks_within_div() changes the variable i in create_exhibits_list() .您在两个函数中都使用了全局变量i ,因此get_all_tasks_within_div()中的for循环更改了create_exhibits_list()中的变量i So when you use elements[i] after calling the function, i has changed to a nonexistent index in the elements array.因此,当您在调用 function 后使用elements[i]时, i已更改为elements数组中不存在的索引。

You should always declare variables to be local with var or let unless you specifically need to use a global variable.除非您特别需要使用全局变量,否则您应该始终使用varlet将变量声明为局部变量。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM