面试中遇到过的闭包~

面试中遇到过的闭包~

其实我本来想起的标题名字是为什么前端面试都要问闭包或当面试官问我闭包时,想了解什么,但是我又无法给出回答,怕别人为了寻找答案,点进来发现被欺骗了,这样可不好。若是有看客能回答一下,那还真不错。

阮大大说闭包是能够读取其他函数内部变量的函数,我觉得这一句话就足以让我了解闭包了。网上将闭包的博文太多了,我贴点儿栗子吧,有助于自己对闭包的理解。

复制代码
function foo(x) {
    var tmp = 3;
    return function (y) {
        alert(x + y + (++tmp));
    }
}
var bar = foo(2); // bar 现在是一个闭包
bar(10); 
//16
复制代码

这是在网上看到的一道笔试题:问a、b、c分别输出什么

复制代码
function fun(n,o) {
  console.log(o)
  return {
    fun:function(m){
      return fun(m,n);
    }
  };
}
var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1);  c.fun(2);  c.fun(3);
//undefined, 0, 0, 0
//undefined, 0, 1, 2
//undefined, 0, 1, 1
复制代码

你做对了嘛?

第一个undefined,是o一开始没有传值,所以是undefined

复制代码
a = {
  fun: function(m) {
      return fun(m,0);   
    }   
}
a.fun(1) -> fun(1,0);
a.fun(2) -> fun(2,0);
a.fun(2) -> fun(3,0);

fun(0).fun(1) -> fun(1,0);
fun(0).fun(1).fun(2) -> fun(2,1);
fun(0).fun(1).fun(2).fun(3) -> fun(3,2);

c = {
  fun: function(m) {
    return fun(m,1);
  }
}
c.fun(2) -> fun(2,1);
c.fun(3) -> fun(3,1);
复制代码

看懂了么,如果没看懂,这儿有更详细的讲解http://developer.51cto.com/art/201511/498268.html

复制代码
var name = 'global';
var obj = {
    name : 'obj',
    dose : function(){
        this.name = 'dose';
        return function(){
            return this.name;
        }
    }
}
alert(obj.dose().call(this))
//'global'
复制代码

你做对了嘛?

var aaa = obj.dose() -> return this.name
aaa.call(this) -> window.name

call(this)相当于将函数运行环境中的this对象替换成window

来,看看下面这个会输出什么呢?(这个题很经典,因为我曾经面试时遇到过!!)

复制代码

<ul id="test">
  <li>这是第一条alert(0);</li>
  <li>这是第二条alert(1);</li>
  <li>这是第三条alert(2);</li>
</ul>
<script type="text/javascript">
  var elements = document.getElementById('test').querySelectorAll('li');
  for (var i = 0; i < elements.length; i++) {
    elements[i].onclick = function () {
      alert(i);
    }
  }
</script>

//点击每一条都alert:2

复制代码

click方法中的i是一直随着for循环累加的,它没有在i=0或者i=其他时,记录下这个值,所以alert出的是最后i的值2

 先酱~等我遇到再慢慢积累,第三篇喽~坚持住~[我最棒!!]

得之我幸,不得我再努力~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值