闭包
闭包(Closure)
自调函数
-
使用
(function(){ })(); <script> function demo(){ var m=100; function fn(){ console.log(m); } return fn; } var f=demo(); f(); </script>
-
注意
-
可以正常使用参数
-
自调函数后加语句结束符(😉
-
用处
-
产生局部的作用域 避免全局变量
-
JS的模块化
方法1
<script>
(function(){
var lis=document.querySelectorAll("ul li");
function demo(a){
return function(){
alert(a);
}
}
for(var i=0;i<lis.length;i++){
lis[i].onclick=demo(i);
}
})()
</script>
方法2
<script>
(function(){
var lis=document.querySelectorAll("ul li");
for(var i=0;i<lis.length;i++){
lis[i].onclick=(function(m){
return function(){
alert(m);
}
})(i);
}
})()
</script>
方法3
<script>
(function(){
var lis=document.querySelectorAll("ul li");
for(var i=0;i<lis.length;i++){
(function(i){
lis[i].onclick=function(){
alert(i);
}
})(i)
}
})()
</script>
闭包
- 能够读取其他作用域变量的函数 就是闭包
闭包的作用
- 读取函数内部的变量
- 让这些变量的值始终存在内存中
闭包缺点
- 导致函数中的变量的保存在内存中(IE中容易造成内存泄漏),增大开销
原型和原型链
原型
- 每一个对象都有原型(原型也是一个对象)
- 对象可以从其他原型继承属性和方法
- 属性 proto(对象的方法)
- 属性 prototype(对象的构造函数的方法)
原型链
- 对象的原型还有原型
- 一直到null