本帖最后由 ykl4452 于 2009-11-13 23:33:51 编辑

解决方案 »

  1.   

    11.2.3 请再往下看到this段落  - -!
      

  2.   

    难道闭包时 this指向了作用域链的最顶端?
      

  3.   

    “闭包中的this指向window”这个结论很简单,也很容易记忆,但是背后的原理却不是那么简单的,我贴这个帖子主要是确定一下"背后的原理"
      

  4.   

    阿q一下 还记得闭包中循环变量的问题吗  内层函数调用的循环变量都是其最终值 ,因为内层函数的作用是是在其定义是确定的,也就是外层函数执行的时候。所以是最终值。而this可以不以这样理解。抛砖引玉~~~
      

  5.   

    我在你上一个帖子里回复到:希望你看一下这部分,Cloudgamer也跟你提到过,不过貌似你却没去看这里。
      

  6.   

    看来楼主对函数理解不深入啊
    函数有作用域,还有调用对象,作用域问题是一个链式,一层一层往外找,这个看来你已经知道了在你的例子中, 没有指明谁调用fn,那么就是 window调用了,我稍微改了一下你的代码,希望你能理解吧 var outwrap = function(){
                var fn = function(){
                    //结果是[object Window]
                    alert(this);
                };
    fn();
                
    fn.call(this);


    this.test = fn;
    this.test();

            };
            var o = new outwrap();
      

  7.   

    to dh20156:冤枉啊,这段我绝对有看,可是和这个的应用场合不太一样
    在执行outwrap构造函数的时候,执行fn(). 
    首先,在执行构造函数outwrap()的时候,他内部的this指向谁??毫无疑问,是outwrap的实例对象o,
    那么按理来说,fn()的调用者——构造函数outwrap(),应该会把this的值传递给fn(),可是没有。
    换句话说,此时的this应该指向outwrap的实例对象o,可是实际却不是如此。这也是令我非常疑惑的地方,也是10.2.3章节无法解释的,所以才会有这篇帖子和之前那片帖子
      

  8.   

    是你不理解,类似this.test和fn看似都是相同的方法,但是对于this的解释是截然不同的,不能混为一谈
      

  9.   

    你调用fn.call(this); 已经破坏了我的本意,我的本意是想说:fn()内部的this应该指向实例对象o,但实际不是这样,这是为什么呢?因为fn()的调用者——outwrap()构造函数,把null作为this的值传递给fn()。那么更进一步的说,为什么构造函数outwrap()会把null作为this的值传递给fn(),答案就是我在一楼贴的内容
      

  10.   


    我给你加了三句话
    fn.call(this); this.test = fn; 
    this.test(); 用了两种方式显式指明调用对象,函数的this只跟调用对象有关,跟作用域无关,如果没有显式指定调用对象,那么就是windows.你的fn没有显式指明调用对象,那么就是windows函数里面的变量分为两种,this.xxx 或是 xxx, 前一种会去调用对象找,后一种会去作用域找
      

  11.   

    http://blog.csdn.net/xiaofan_sap/archive/2009/10/15/4677394.aspx
    看看这篇文章