//1.下面代码执行后的结果是?如何处理
var arr = [];
for(var i = 0;i<10;i++){
	arr.push(function () {
		console.log(i);
	})
}//[function(){},function(){},function(){},function(){}。。。。]
arr[6](); //i是几 10
// //由于for循环先执行,函数的调用后执行 因此函数调用的时候 for循环已经执行完了,i==10 

//解决问题 闭包  闭包特点:闭包中声明的变量 类似于全局变量 会被一直保存在内存中
var arr1 = [];
for (var i = 0; i < 10; i++) {
	(function(a) {
		//形参a相当于声明了变量a
		//var a = i
		arr1.push(function() {
			console.log(a);	//6
		})
	})(i)
}
arr1[6](); //6
/*示例
for (var i = 0; i < liS.length; i++) {
	(function (a) {
		//函数的形参 就相当于在 函数中 声明了一个变量
		//var a = 实参0
		liS[a].onclick = function () {
			console.log(a); //5
		}
	})(i);
}*/

//2.
function fun(n, o) {
	console.log(o);
	return {
		fun: function(m) {
			return fun(m, n);
		}
	};
}
var a = fun(0); //n:0 o:undefined   undefined
//a:{fun:function(m){ return fun(m,n) }} //这里调用的fun是全局的fun函数
a.fun(1); //m:1 n:0 fun(1,0)  0
a.fun(2); //m:2 n:0 fun(2,0)  0
a.fun(3); //m:3 n:0 fun(3,0)  0
//上述所有a的fun方法的调用 获取的都是第0个n

//3.
for (var i = 0; i < 5; i++) {
	setTimeout(function() {
		console.log(i, new Date());
	}, 1000);
}
console.log(i, new Date()); //循环已经结束 i==5 当前时间
//5 当前时间
//(5 当前时间+1s)*5 

//js中分为 同步和异步 代码
//异步代码:事件 定时器 ajax
//同步代码:非异步代码
//js中先执行同步代码  再将异步代码从任务队列中取出 执行
//js在内存中开辟出了一块空间  任务队列  在执行代码的时候如果遇到异步代码就先放到任务队列中等待