zoukankan      html  css  js  c++  java
  • for循环中常见的问题

    for循环使用中常有的问题

    for循环的执行顺序:设置循环变量 -> 循环判断 -> 满足执行循环体 -> 循环变量自增

    通过let声明的循环变量,在整个for循环中let i只声明了一次,但产生了三个块级作用域,生成了块级作用域,每次循环的i都是独立的一份。

    第二次循环的i是怎么知道上一个块级作用域中的i的?

    JavaScript引擎内部会记住上一轮的循环的值,初始化本轮变量时,就在上一轮的基础上进行计算

    引用类型值参加for循环时,块级作用域实际保存的是变量的引用地址,指向的都是同一个堆内存中的数据

      const data = []
      for(var i = 0; i < 3; i++) {
        data[i] = function() {
          console.log(i)
        }
      }
    
      data[0]() // 3
      data[1]() // 3
    
      const data = []
      for(var i = 0; i < 3; i++) {
        data[i] = (function() {
          console.log(i)
        })(i)
      }
    
      data[0] // 0, 1, 2
    
      let i = 0, data = []
      if(0 < 3) {
        data[0] = function() {
          console.log(i)
        }
      }
    
      i++
    
      if(1 < 3) {
        data[1] = function() {
          console.log(i)
        }
      }
    
      i++
    
      if(2 < 3) {
        data[2] = function() {
          console.log(i)
        }
      }
    
      i++
    
      data[0]() // 3
      data[1]() // 3
    
      let i = 0, data = []
      if(0 < 3) {
        let k = i
        data[0] = function() {
          console.log(k)
        }
      }
    
      i++
    
      if(1 < 3) {
        let k = i
        data[1] = function() {
          console.log(k)
        }
      }
    
      i++
    
      if(2 < 3) {
        let k = i
        data[2] = function() {
          console.log(k)
        }
      }
    
      i++
    
      data[0]() // 0
      data[1]() // 1
    
      const data = []
      for(let i = 0; i < 3; i++) {
        data[i] = function() {
          console.log(i)
        }
      }
    
      data[0]() // 0
      data[1]() // 1
    
      const data = []
      for(let i = 0; i < 3; i++) {
        data[i] = function() {
          console.log(i)
        }
      }
    
      data[0]() // 0
      data[1]() // 1
    
      // 引用类型值参加for循环时,块级作用域实际保存的是变量的引用地址,指向的都是同一个堆内存中的数据
      const data = []
      for(let x = {i: 0}; x.i < 3; x.i++) {
        data[x.i] = function() {
          console.log(x.i)
        }
      }
    
      data[0]() // 3
      data[1]() // 3
    
      let x = {i: 0}, data = []
      if(0 < 3) {
        let k = x
        data[k.i] = function() {
          console.log(k.i)
        }
      }
    
      x.i++
    
      if(1 < 3) {
        let k = x
        data[k.i] = function() {
          console.log(k.i)
        }
      }
    
      x.i++
    
      if(2 < 3) {
        let k = x
        data[k.i] = function() {
          console.log(k.i)
        }
      }
    
      x.i++
    
      data[0]() // 3
      data[1]() // 3
    
      const data = []
      let x = {i: 0}
      for(let y = x.i; y < 3; y++) {
        data[y] = function() {
          console.log(y)
        }
      }
    
      data[0]() // 0
      data[1]() // 1
    

    参考文档 地址

  • 相关阅读:
    while (cin>>str)退出死循环
    内存溢出(heap corruption detected:)
    二叉树的遍历--递归+非递归(两种)
    直接插入排序(带哨兵和不带哨兵)
    二项队列
    左式堆
    优先队列之二叉堆与d-堆
    centos6.4 安装code::blocks
    结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆、斜堆
    数据结构与算法分析-开放定址散列表的实现
  • 原文地址:https://www.cnblogs.com/sk-3/p/12903401.html
Copyright © 2011-2022 走看看