面试-闭包

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html,这个阮一峰关于闭包的解答,言简意赅。

闭包作为在面试中经常被问到的问题。引用阮一峰的话来说:

闭包就是能够读取其他函数内部变量的函数。

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。

所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

要搞清楚闭包首先要知道执行上下文的概念和JS的链式作用域的特点:

子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

 在这里详细的说一下阮一峰博客中的两个思考题:

var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      return function(){
        return this.name;
      };

    }

  };

  alert(object.getNameFunc()());//"The Window";
    

  很显然第一题弹出内容是“The Window”’,为什么呢?

      因为object.getNameFunc()的结果是function(){return this.name},而这个object.getNameFunc()是在window.onload中执行的,而this的指向是向上追溯到首个调用该函数的对象,此时函数是在window下执行,也就是全局环境,所以此时的this.name即是window.name,也就是“The Window”

 

 

 

 

第二题:

 

 

 var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };

    }

  };

  alert(object.getNameFunc()());//“My Object”

  第二题跟第一题的不同之处在于在定义getNameFunc的时候用that将当前的this进行了存储。

      跟第一题相同object.getNameFunc()的结果是function(){return that.name}这个方法,这个方法同样是在window.onload中执行,也就是全局环境下,所以当前的this仍然是window,但是在调用getNameFunc()时往上回溯的首个对象是Object,并且在执行这个方法时将当前的this也就是Object这个对象存储到了that当中,所that.name也就是obejct.name,也就是“My Object”

 

 

 我们再打印一下that

 

 

 

 

posted @ 2022-01-08 20:10  SadicZhou  阅读(68)  评论(0编辑  收藏  举报