js闭包学习心得总结
首先引用来自官网文档的定义:
closureisthecombinationofafunctionandthelexicalenvironmentwithinwhichthatfunctionwasdeclared.
闭包是一个函数和其内部公开变量的环境的集合.
简单而言,闭包=函数+环境
第一个闭包的例子
functioninit(){ varname='Mozilla';//nameisalocalvariablecreatedbyinit functiondisplayName(){//displayName()istheinnerfunction,aclosure alert(name);//usevariabledeclaredintheparentfunction } displayName(); } init(); becauseinnerfunctionshaveaccesstothevariablesofouterfunctions,displayName()canaccessthevariablenamedeclaredintheparentfunction,init().
其实这个栗子很简单,displayName()就是init()内部的闭包函数,而为啥在displayName内部可以调用到外部定义的变量name呢,因为js内部函数有获取外部函数中变量的权限。
第二个例子
vardata=[ {'key':0}, {'key':1}, {'key':2} ]; functionshowKey(){ for(vari=0;i上面这个例子可以正确输出101112吗?
答案是:并不能,并且还会报语法错误....
console.log(i);发现i输出了3次3,也就是说,在setTimeout1000毫秒之后,执行闭包函数的时候,for循环已经执行结束了,i是固定值,并没有实现我们期望的效果。
console.log(this);发现this指向的是Window,也就是说,在函数内部实现的闭包函数已经被转变成了全局函数,存储到了内存中。
所以需要再定义一个执行函数
vardata=[ {'key':0}, {'key':1}, {'key':2} ]; functionshowKey(){ varf1=function(n){ data[i].key=data[i].key+10; console.log(data[i].key) } for(vari=0;i