闭包
含义:有权访问另一个函数作用域的变量的函数
创建方式:在一个函数内部创建另一个函数
function createFunctions(){
var result=[];
for(var i=0;i<10;i++){
result[i]=function(){
return i;
}
}
return result;
}
console.log(createFunctions()[1]())
//表面上看,每个函数都应该返回自己的索引值,即位置0对应0,位置1对应位置1,但实际上每个函数都返回10。
//因为每个函数作用域链中都保存着createFunctions()函数的活动对象,所以引用的都是同一个变量i;
//或者换个说法,result[i]=function(){}中的i使用的是外部的i,是个全局变量
`解决方法`
function createFunctions(){
var result=[];
for(var i=0;i<10;i++){
result[i]=function(num){
return function(){
return num;
}
}(i); //将i作为参数传入,num就是接收的变量
}
return result;
}
this对象
含义:运行时基于函数的执行环境绑定的:在全局函数中this相当于window
注意点:匿名函数的执行环境具有全局性,因此this对象指向window
var name='小鱼';
var obj={
name:'小二',
getName:function(){
return this.name;
}
}
console.log(obj.getName()()) //得到的小鱼,因为是匿名函数,这里的this指向window
定时器
1.高级定时器
javascript是运行于单线程环境中的,而定时器只是表示在多长时间后加入队列。出来主Javascript执行进程外,还有一个需要在进程下一次空闲时执行的代码队列。
例子:
btn.onclick=function(){
setTimeout(function(){
console.log(111);
},250)
} //点击按钮后,经过250ms后,指定的代码添加到队列中等待执行。队列中的所有代码都要等到javascript进程空闲后才能执行,所以有一些页面倒计时一般不放在前端进行。
2.重复的定时器
setInterval():多次定时。
重复定时器存在的两个问题:1.某些间隔会被跳过;2.多个定时器的代码执行之间的间隔会比预期的小。
例:每隔200ms添加到队列,第一个205ms,第二个405ms处,第三个605ms,加入605ms时,第一个定时器的代码仍在运行,同时队列中已经添加了第二个定时器代码的实例,所以在605ms处,这个时间点的定时器代码不会被加入队列中,而当第一个定时器的代码结束,第二个定时器代码会立即执行,所以定时器代码时间间隔比较小.
解决方法:
function sendTime(){
var i=0;
setTimeout(function(){
i++;
console.log(i);
setTimeout(arguments.callee,1000); //来获取对当前函数的引用,但是在严格模式下会报错,将arguments.callee改为函数sendTime()
},1000)
}
这样做的好处是在前一个定时器代码执行完之前,不会相对列加入新的代码,确保了不会有任何的缺失间隔,而且保证在下一次定时器代码执行之前,至少要等待指定的间隔
3.如何判断一个对象为空
var obj={};
console.log(JSON.stringify(obj)=='{}');
console.log(Object.keys(obj).length==0)