一,作用域
变量在声明它的函数及该函数所嵌套的任意函数是有定义的
例
var num=2;
function fun(){
console.log(num);//undefined
var num=3;
console.log(num);//3
}
fun();
二, 作用域链
多个函数嵌套在一起,多个作用域相互嵌套,这是作用域链
var num=1;
function fun(){
var num=2;
function fun1(){
var num=3;
console.log(num);//3
}
function fun2(){
console.log(num);//2
}
}
fun1();
fun2();
fun();
访问原则
首先会在当前函数作用域中查找,没有会沿作用域链向上查找。直到全局作用域。
三,闭包
什么是闭包:能够访问其他函数内部的变量的函数;
为什么要有闭包:为了在函数外部读取局部变量。
闭包基于原理:作用域链,父函数变量对子函数可见的;
闭包作用:1访问其他函数内部变量
2:保护变量不被内存回收机制回收;
例
for(var i=0;i<5;i++){
setTimeout(function(){
console.log(i+' ');
},100);
}
输出结果为5,5,5,5,5
因为js是单线程,setTimout注册函数需要等待线程空间才能执行,此时for循环已经结束,i为5;
若想输出0,1,2,3,4
则,将setTimeout放在函数立即调用表达式中,将值作为参数传递给包裹函数,创建闭包
例
for(var i=0;i<5;i++){
(function(i){
setTimeout(function(){
console.log(i+' ');
},100);
}(i));
}
例二
function add(){
var x=1;
console.log(++x);
}
add();//2
add();//2
若想实现每次执行加1;
function add(){
var x=1;
return function(){
console.log(++x);
}
}
var num=add()
num();//2
num();//3