VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 网站开发 > JavaScript >
  • 面试-闭包

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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”

 

 

 

 

第二题:

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

 

 

 

原文链接:https://www.cnblogs.com/SadicZhou/p/15779430.html


相关教程