Chinaunix首页 | 论坛 | 博客
  • 博客访问: 273708
  • 博文数量: 80
  • 博客积分: 2269
  • 博客等级: 大尉
  • 技术积分: 836
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-09 11:07
文章分类

全部博文(80)

文章存档

2016年(1)

2013年(8)

2012年(23)

2011年(21)

2010年(21)

2009年(6)

我的朋友

分类: JavaScript

2013-06-20 15:43:25

二、this指针:[P83]

在这里列出this在ECMAScript中的不同含义:

(1) 在全局执行环境中使用this,表示Global对象,在浏览器中就是window对象。

(2) 当在函数执行环境中使用this时,情况就有些复杂了。如果函数没有明显的作为非window对象的属性,而只是定义了函数,不管这个函数是不是定义在另 一个函数中,这个函数中的this仍然表示window对象。如果函数显示地作为一个非window对象的属性,那么函数中的this就代表这个对象。 (当然可以使用apply或者call函数来取代默认this的引用,详见[P88])

(3) 当通过new运算符来调用函数时,函数被当做一个构造函数,this指向构造函数创建出来的对象。
参考:
《JavaScript基础与案例开发详解》清华大学出版社
    


点击(此处)折叠或打开

  1. 1    function f(x) {
  2. 2     var g = function () { return x; }
  3. 3     return g;
  4. 4    }
  5. 5    var g1 = f(1);
  6. 6    alert(g1()); //输出 1

  7. 假设我们把全局看成类似以下这样的一个大匿名函数:
  8. 1    (function() {
  9. 2     //这里是全局范围
  10. 3    })();

  11. 那么例子就可以看成是:
  12. 1    (function() {
  13. 2     function f(x) {
  14. 3     var g = function () { return x; }
  15. 4     return g;
  16. 5     }
  17. 6     var g1 = f(1);
  18. 7     alert(g1()); //输出 1
  19. 8    })();



    全局的大匿名函数被定义的时候,它没有外层,所以它的作用域链是空的。
    全局的大匿名函数直接被执行,全局的作用域链里只有一个 '全局调用对象'。
    函数 f 被定义,此时函数 f 的作用域链是它外层的作用域链,即 '全局调用对象'。
    函数 f(1) 被执行,它的作用域链是新的 f(1) 调用对象加上函数 f 被定义的时候的作用域链,即 'f(1) 调用对象->全局调用对象'。
    函数 g (它要被返回给 g1,就命名为 g1吧)在 f(1) 中被定义,它的作用域链是它外层的函数 f(1) 的作用域链,即 'f(1) 调用对象->全局调用对象'。
    函数 f(1) 返回函数 g 的定义给 g1。
    函数 g1 被执行,它的作用域链是新的 g(1) 调用对象加上外层 f(1) 的作用域链,即 'g1 调用对象->f(1)调用对象->全局调用对象'。


阅读(2276) | 评论(3) | 转发(1) |
给主人留下些什么吧!~~