发表于: 2017-04-26 21:59:31
1 1012
今天完成的事情:
天天听闭包的概念,终于找到了一个实例解说闭包的,而且很浅显易懂啊:
闭包简单的说就是一个函数能访问外部函数的变量,这就是闭包,比如说:
function a(x){
var tem=3;
function b(y){
console.log(x+y+(++tem));
}
}
a函数中的b函数就是闭包了,b函数可以使用a函数的局部变量,参数,最典型的闭包应该是下面这样,将定义在函数中的函数作为返回值
function a(x){
var tem=3;
function b(y){
console.log(x+y+(++tem));
}
return b;
}
闭包的另一种作用是隔离作用域,比如:
for(var i=0;i<2;i++){
setTimeout(function(){
console.log(i);
},0);
}
上面这段代码的执行结果是2,2而不是0,1,因为等for循环出来后,执行setTimeout中的函数时,i的值已经变成了2,这就是没有隔离作用域所造成的,比如:
for(var i=0;i<2;i++){
(function(i){
setTimeout(function(){
console.log(i);
},0)
})(i);
}
这样就会输出0,1,我们的立即执行函数创建了一个作用域,隔离了外界的作用域。
闭包的缺点是,因为内部闭包函数可以访问外部函数的变量,所以外部函数的变量不能被释放,如果闭包嵌套过多,会导致内存占用大,要合理使用闭包。
那么为啥使用闭包呢,这就涉及到了内存泄漏:
内存泄漏指的是浏览器不能正常的回收内存的现象
看知乎上老大说for循环多的是垃圾代码,加法操作多的是垃圾代码,嵌套一塌糊涂的是垃圾代码之类,遂去了解一下:
关于加法:
加号在js中非常耗时和耗内存,需要经过六步:
1.开辟一块临时空间,存储字符串
2.然后再开辟一块空间
3.把str中的字符串复制到刚刚开辟的空间
4.把需要连接的字符串复制到str后面
5.str指向这块空间
6.回收str原来的空间和临时空间
可以通过数组的push方法来替代加法操作,数组是连续的存储空间,可以省下很多步
学到事件委托机制(大大的省代码哟)
比如要监听下面的<li>
<ul>
<li>
<li>
<li>
<li>
</ul>
使用事件委托就只需要在<ul>上设置监听器函数,就可以监听所有<li>的事件了,可以大大提高性能,减少绑定事件的元素,减少内存占用,提高效率。
明天要做的事:
测试任务四代码,修改bug,优化代码
遇到的问题:
已经声明UTF-8编码了,js中的弹出字出现乱码,但是html中字正常显示。
以前都是在开头声明一下编码方式,但是js中无法声明,最后发现要在IDE中规定,给跪了:
收获:
对console的操作更熟练了,弹弹弹各种东西看效果。
代码熟练度UP,准备优化一下代码,而且以前优化代码是优化CSS代码,只需要考虑减少代码行数,书写规范,增加可读性就好了;但是JS的代码优化可能越优化代码行数越多,但是占用的内存下降了,提高浏览器的解析效率就是成功的优化。
评论