作用域与闭包
//作用域 /* 执行上下文 * 范围:一段<script>或者一个函数 * 全局:变量定义、函数声明; 一段<script> * 函数:变量定义、函数声明、this、arguments; 函数 * PS: 函数声明 与 函数表达式区别 * */ fn() function fn(){ //函数声明 } //fn1() //undefined var fn1=undefined var fn1=function(){ //函数表达式 } //2. this /* 构造函数 new * 对象属性 obj * 普通函数 window * call apply * */ //无块级作用域 if(true){ var name= 'xxx' } console.log(name) //xxx //函数和全局作用域 var a=100; function fn2(){ var a=200 console.log('fn2',a) } console.log('g',a) //100 fn2() //200 //作用域链 自由变量不断向父级去找 var a=100; function fn3(){ var b=200; //当前作用域没有定义的变量,叫自由变量 console.log(a) console.log(b) } fn3() //闭包 function F1(){ var c =100; //返回函数 return function(){ //父级作用域是F1而不是全局 console.log(c) //自由变量去他父级作用域找 } } var f1=F1(); var c= 200 f1() //作用域在定义时就确定了 而不是执行时 //闭包 //1、函数作为返回值; //2、函数作为参数传递 function F1(){ var a=100; return function(){ console.log(a) } } var f1=F1(); function F2(fn){ var a=200; fn(); } F2(f1); /* 1.变量提升的理解 * `变量定义 * `函数声明() * */ //3.10个a for (var i=0; i<10; i++) { (function(i){ var a=document.createElement('a'); a.innerHTML=i+'<br>' a.addEventListener('click',function(e){ e.preventDefault(); alert(i) }) document.body.appendChild(a) })(i) } //4.如何理解作用域 //1.自由变量 2、作用域链,即自由变量查找 3、闭包的两个场景 //5.闭包 实际应用中主要用于封装变量,收敛权限 function isFirstLoad(){ var _list= [] return function(id){ if (_list.indexOf(id)>= 0) { return false; } else{ _list.push(id) return true } } } var firstLoad = isFirstLoad() firstLoad(10) //true firstLoad(10) //false firstLoad(20) //true