JavaScript面试技巧(作用域和闭包)

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

 

转载于:https://www.cnblogs.com/CarsonScarlet/p/7458847.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值