Chinaunix首页 | 论坛 | 博客
  • 博客访问: 257245
  • 博文数量: 45
  • 博客积分: 170
  • 博客等级: 入伍新兵
  • 技术积分: 488
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-13 14:43
文章分类

全部博文(45)

文章存档

2014年(2)

2013年(35)

2012年(8)

我的朋友

分类: JavaScript

2013-09-05 22:35:52

例1:

点击(此处)折叠或打开

  1. var name = "The Window";
  2.   var object = {
  3.     name : "My Object",
  4.     getNameFunc : function(){
  5.       return function(){
  6.         return this.name;
  7.      };
  8.     }
  9. };
  10. alert(object.getNameFunc()());
输出:The Window ,如果去除this,则输出My object

例2:

点击(此处)折叠或打开

  1. var name = "The Window";
  2. var object = {
  3.     name : "My Object",
  4.     getNameFunc : function(){
  5.             alert(this.name)
  6.      function a(){
  7.         return this.name;
  8.      };
  9.         return a;
  10.     }
  11. };
  12. alert(object.getNameFunc()());
输出:My Object,The Window,不管return this.name还是name都是输出The Window

    其实最关键的就是要明白作用域链和闭包所起到的作用,其实闭包说到底就是一个函数,而且函数调用返回后其资源所占用的栈区并没有释放,所以变量就还保存在内存中,由于作用域链的关系,它会去寻找离其最近的var声明,var声明所在就是该闭包所在的层,从而在这层里面所得到的结果就是它最后的值,于是乎返回值也就是这个最终的值了.
    结论:如果没有指定作用域,则函数执行的时候,查找相同的作用域声明,如果指定作用域,则根据指定的作用域查找声明,并且当一个函数作为函数而不是方法来调用的时候,this指向的是全局对象,(如例1所示);同理例2中由于返回的是函数,还没有执行,再执行过程中是全局对象,因此alert(object.getNameFunc()())永远返回The Window

阅读(2185) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~