关于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的值。

原文地址:https://www.cnblogs.com/hmy-666/p/12606420.html

时间: 2024-08-12 03:39:39

关于js的易错知识的相关文章

javascript易错知识

1.在try-catch语句中,finally子句是可选的,当包含finally子句的时候,无论try还是catch语句中的return语句都会被忽略.所以,我们在使用finally子句的时候,要想清楚我们希望代码如何执行. function fn () { try { a++; } catch(error) { console.log("in catch"); return; } finally { console.log("in finally"); } } f

JS的易错代码

1. var val = false; var x = val || []; console.log(x); //[]

js undefined易错分析

undefined 以下是错误写法: data = undefined; alert(undefined==false);//这样判断会输出false; if(data!=undefined || data!='' || data!=null || data!="/"){ alert(111); //*会输出111,因为先判断data!=undefined为假后,再开始继续判断data!='' return false; }else{ alert(222); return true;

js基础知识易错点(一)

最近替另一个项目招人,要求基础知识好,随便问了一些基础题,发现了一些易错的点,总结一下. 1.判断一个空数组 var arr = []; 1)JSON.stringify(arr) == "[]" 2)arr instanceof Array && arr.length == 0 3)Array.prototype.isPrototypeOf(arr) && arr.length == 0 测试一个对象是否在另一个对象的原型链上 注意:此处要注意,单纯判

Javascript易错知识点

? JS易错知识点总结: == 和 === 的区别: ==:判断两个变量的值是否相等. ===:判断两个变量的类型和值是否都相等,两个条件同时满足时,表达式为True. switch中break的作用: 如果一个case后面的语句,没有写break,那么程序会向下执行,而不会退出: 例如:当满足条件的case 2下面没有break时,case 3也会执行 1 var num = 2; 2 switch(num){ 3 case 1: 4 alert('case 1'); 5 break; 6 c

细节!重点!易错点!--面试java基础篇(一)

今天来给大家分享一下java的重点易错点部分,也是各位同学面试需要准备的,欢迎大家交流指正. 1.java中的main方法是静态方法,即方法中的代码是存储在静态存储区的. 2.任何静态代码块都会在main方法之前执行. 3.java程序的初始化顺序:原则:静态优先于非静态,且只初始化一次:父类优先于子类:按照成员定义顺序初始化.例顺序:父类静态变量,父类静态代码块,子类静态变量,子类静态代码块,父类非静态变量,父类非静态代码块,父类构造函数,子类非静态变量,子类非静态代码块,子类构造函数. 4.

细节!重点!易错点!--面试java基础篇(二)

今天来给大家分享一下java的重点易错点第二部分,也是各位同学面试需要准备的,欢迎大家交流指正. 1.字符串创建与存储机制:当创建一个字符串时,首先会在常量池中查找是否已经有相同的字符串被定义,其判断的依据是String类型equals的返回值,若已经定义,则直接获取对其的引用.此时不需要创建新的对象,如果没有定义,首先创建这个对象,然后把它加入到字符串池中,再将它的引用返回.(例:new String(”aaa“)可能创建了1个或者2个对象,如果常量池中原来有aaa那么之创建了一个对象,如果没

[SQLXML]FOR XML语法导出XML的易错之处

原文:[SQLXML]FOR XML语法导出XML的易错之处 [SQLXML]FOR XML语法导出XML的易错之处 Version Date Creator Description 1.0.0.1 2006-6-29 郑昀@Ultrapower 草稿 继续阅读之前,我们假设您熟悉以下知识: n         MS SQL Server 2000 n         Sp_makewebtask n         FOR XML 子句 如果不熟悉这些知识点,可以看下面两小节[准备工作一:FO

黑马程序员---C基础3【变量的易错】【程序结构】【if语句】【Switch语句】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [变量的易错] 1.变量为什么要初始化为0 int  sum,a=3: sum = sum+a 如果未初始化则会成为一个不确定的变量,结果也会不确定,容易出错. 2.不同类型的变量之间的转换 切记int  a=1,b=0:b=1-1.5:其中b为一个整型所有结果是保留整数部分的0,而不是-0.5,又因为0没有正负之分,所有保存结果为b=0: 3.关于Xcode的一个快速注释的插件 快捷键://