zoukankan      html  css  js  c++  java
  • 关于js的易错知识

    1 var arr = [];
    2  for(var i = 0;i<2;i++){
    3      arr[i]=function(){
    4          console.log(i);//这里由于内部没有定义i,根据函数链它会往上一层寻找最近的作用域下的i
    5      }
    6  }
    7  arr[0]();
    8  arr[1]();

    上述输出的都是2。

    为什么呢?其实上述的操作是给aar数组添加了两个函数,所以自然可以用数组加下标和()执行函数。

    易错点是人们常常以为第一个输出的是0,第二个函数输出的是1.

    但是由于函数执行是自上而下的,函数运行到7,8行时,上面的变量i,已经变成了2,所以都是2.

    但是我想说的是,这里的i是var定义的,当用let定义的时候将会完全不一样。

    1 let arr1 = [];
    2  for(let i = 0;i<2;i++){
    3      arr1[i]=function(){
    4          console.log(i);//这里由于内部没有定义i,根据函数链它会往上一层寻找最近的块级作用域下的i
    5      }
    6  }
    7  arr1[0]();
    8  arr1[1]();

    输出的结果会是0,1

    主要原因是let的块级作用域的影响,for函数每次执行都会产生一个块级作用域,每个块级作用域中的变量i都不是同一个i,函数执行时是自己上一级作用域下i的值。

    穷则独善其身,达则兼济天下……
  • 相关阅读:
    对自己负责~~
    继续负责
    问题的一天
    1个月=22年
    刚才写的没显示?
    布置任务
    心情很糟
    考试结束
    没有负责哈
    php获取任意时间的时间戳
  • 原文地址:https://www.cnblogs.com/hmy-666/p/12606420.html
Copyright © 2011-2022 走看看