全局预处理与执行
处理函数声明有冲突,会覆盖
处理变量声明时有冲突,会忽略
闭包
闭包是词法闭包的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境变量也不例外。所以,有另一种说法认为闭包是由函数和与之相关的引用环境组合而成的实体。
function f1(){
var a=10;
var b=20;
function f2(){
console.log(a);//子函数访问父函数
}
f2();
}
f1();
闭包的好处
减少全局变量
减少传递给函数的参数数量
封装
// var a=0;
// function add(){
// a++;
// alert(a);
// }
// add();
// add();
// //减少全局变量
// function f(){
// var a=0;
// return function(){
// a++;
// alert(a);
// }
// }
// var result=f();
// result();
// result();
// //减少传递给函数的参数数量
// function calFactory(base){
// return function(max){
// var total=0;
// for(var i=1;i<=max;i++){
// total+=i;
// }
// return total+base;
// }
// }
// var adder=calFactory(2);
// alert(adder(3));
//封装
(function(){
var m=0;
function getM(){
return m;
}
function setM(val){
m=val;
}
window.g=getM;
window.f=setM;
})();
f(12);
alert(g());
闭包需要注意的点
对捕获的变量只是个引用,不是复制
父函数没调用一次,会产生不同的闭包
循环中问题
// //引用
// function f(){
// var num=1;
// return function(){
// num++;
// alert(num);
// }
// }
// var result1=f();
// result1();
// result1();
// var result2=f();
// result2();
// result2();
// for(var i=1;i<=3;i++){
// var ele=document.getElementById(i);
// ele.οnclick=function(){
// alert(i);
// }
// }
var i;
for(i=1;i<=3;i++){
var ele=document.getElementById(i);
ele.onclick=(function(id){
return function(){
alert(id);
}
})(i);
}