1.闭包应用场景
1)函数作为返回值,例如:
1 function F1(){ 2 var a = 100; 3 return function(event){ 4 console.log(a) //自由变量,去父作用域找 5 } 6 } 7 8 var f1 = F1(); 9 var a = 200; 10 f1();
2)函数作为参数传递,例如:
1 function F1(){ 2 var a = 100; 3 return function(event){ 4 console.log(a) 5 } 6 } 7 8 var f1 = F1(); 9 function F2(fn){ 10 var a = 200; 11 fn(); 12 } 13 F2(f1);
2.说一下对变量提升的理解?
主要说明以下两点:变量定义、函数声明(注意和函数表达式的区别,也就是执行上下文部分的知识)
解析器会率先读取函数声明,要等到解析器执行到它时才执行,
3.this的几种不同使用场景
- 作为构造函数执行
- 作为普通函数执行
- 作为对象属性执行
- call,apply,bind
1 var a = { 2 name: 'A', 3 fn: function(){ 4 console.log(this.name) 5 } 6 } 7 a.fn() //this === A 8 a.fn.call({name:'B'}) //this === {name:'B'} 经常用call改变this的值 9 var fn1 = a.fn; 10 fn1() //this === window
4.如何理解作用域
要点:1)自由变量
2)作用域链,即自由变量的查找
3)闭包的两个场景
5.创建10个标签,点击时弹出对应的序号
1 var i 2 for (i=0; i < 10; i++) { 3 (function (i) { 4 //函数作用域 5 var a = document.createElement('a') 6 a.innerHTML = i + '<br>' 7 a.addEventListener('click', function(e){ 8 e.preventDefault() 9 alert(i) //自由变量,要去父作用域获取值 10 }) 11 document.body.appendChild(a) 12 })(i) 13 }
6.实际开发中闭包的应用
最主要的应用:用于封装变量、收敛权限
例如:
1 function isFirstLoad() { 2 var _list = [] 3 4 return function (id) { 5 if (_list.indexOf(id) >=0) { 6 return false 7 } else { 8 _list.push(id) 9 return true 10 } 11 } 12 } 13 14 var firstLoad = isFirstLoad() 15 firstLoad(10) //true 16 firstLoad(10) //false 17 firstLoad(20) //true 18 firstLoad(20) //false