变量作用域和闭包
变量作用域
当我们写 js 文档的时候经常会设置变量,变量的类型有两种:
- 全局变量
- 局部变量
这两种类型的变量有者不同的作用范围,全局变量的作用范围是面向整个文档的,可以称之为全局作用域,局部变量是在函数内部设置的,作用范围为当前的函数,外部不能直接引用,因此称为函数作用域。
var a=1;
function test(){
var b=2;
console.log(a)
}
test()// 1
console.log(b) //error
闭包
- 简单来说嵌套在函数里的函数以及周边的变量叫闭包
- 闭包周边的变量在执行完函数之后不会被释放,会常驻内存
function test(){
var a = 1;
function test1(){
var b = 2
}return test1
}
var test2=test()
test2();
上面的代码就是一段闭包,函数test1被包裹在函数test中,对于test1而言,test内的所有变量都是可见的,但是反过来不行。将test1作为返回值,就可以在test外部进行读取了。
function test(){
var a = 1;
function test1(){
a++
console.log(a)
}return test1
}
var test2=test()
test2();//2
test2();//3
test2();//4
在上面的代码中,函数test2实际上就是函数test1的闭包函数,我们让其执行三次,结果分别为2、3、4。这是因为,函数test中的局部变量一直被保存在内存中。所以闭包有个缺点,就是内存占用较大。
自执行函数
var callback=(function(){
var a = 1;
function test(){
a ++;
console.log(a)
}
return test;
})();
callback();2
callback();3
上面这段函数也是闭包的一种。
我们利用闭包来做一个小例子。
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
var li = document.getElementsByTagName("li");
for(i=0;i<li.length;i++){
(function(){
var n=i;
li[n].onclick=function(){
var pp = li[n].innerHTML;
alert(pp)
}
})();
}
</script>
</body>
我们创建了一个列表,当我们点击列表的时候,浏览器将列表里的内容弹窗显示。