就要国庆中秋放假了,不知还有没人来论坛,lol,希望还有高手出现
好了言归正传
1)以下两段代码是怎么理解的?
2)为什么说理解了下面两个代码就理解了闭包?    var name = "The Window";  var object = {
    name : "My Object",    getNameFunc : function(){
      return function(){
        return this.name;
      };    }  };  alert(object.getNameFunc()());var name = "The Window";  var object = {
    name : "My Object",    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };    }  };  alert(object.getNameFunc()()); 

解决方案 »

  1.   

    javascript的闭包是用来修改作用域的,最主要的就是将内部函数的作用域提升到上一级.例子当中,一旦运行函数,
     function(){
            return that.name;
          }的作用域会从提升到getNameFunc这个级别.这样会导致的结果就是第二个例子中that被当做私有的,屏蔽掉了,that无法在getNameFunc外面修改.
      

  2.   

    初学JS可能会被闭包绕晕。
    小伙请看仔细:
    第一个例子
      应该弹出:"The Window"。
      
    1.) object.getNameFunc()() -- 先执行object.getNameFunc()那么他返回的是:function(){
            return this.name;
    }2.)object.getNameFunc()() -- 再执行就返回this.name;看到没!这里的this已经不是指向曾经调用它的对象:object了。匿名函数作用域window。***************************************************************************************第二个例子
      应该弹出:"My Object"。
    1.) object.getNameFunc()() -- 先执行object.getNameFunc()那么他返回的是:function(){
            return that.name;
    }
    但是有这行代码:var that = this;
    这里很关键:这个that指向的是调用它的函数对象,也就是object2.)object.getNameFunc()() -- 再执行就返回that.name。所以他返回的就是"My Object"。闭包不要想的太复杂,我个人理解就是java的静态变量。开辟了一块内存供它使用,不会被垃圾回收机制立刻回收掉。
    还有this的意义:指向调用函数的对象,谁调用了这个函数,this就是谁的引用。比如a.b(),b这个方法的函数体里面使用了this,那么这个this就代表a对象的引用。window是个隐式对象 很多情况下简写的时候都不加window,实际上它是一直存在的。还有function(){}如果没有return 那么它默认alert出来的是undefined你可以逐个的alert看看:alert(object.getNameFunc()),alert(object.getNameFunc())个人浅见,有误处请指正。
      

  3.   

    楼上正解。
    需要闹明白JS中的this到底是谁。
    建议看一下这个
      

  4.   

    第一个通过闭包让this跑了出去,在整个函数外的this,当然就最顶层的window了;第二个通过闭包让this跑出去的同时,被that拉了回来,留在了object对象当中的this代表的当然是object自身了;其实第一个还可以修改为:var name = "The Window";  var object = {
        name : "My Object",
        getNameFunc:(function(){
     return name;
     })(),
    }
    alert(object.getNameFunc);
      

  5.   

    我只能说不单单是闭包你要理解 js里面 this是什么意思
      

  6.   

    我觉得主要是this的作用域问题,this的作用域确实很容易搞错,要时刻小心。
      

  7.   

    我觉得楼主看完这位高手的博客之后所有的问题迎刃而解
    http://blog.goddyzhao.me/JavaScript-Internal
      

  8.   

    这个this是指你实例化这个类的对象的变量名字。
      

  9.   

    兄弟,这哥们的博客太给力了,看了一下午,至少给你20分。BTW,你是怎么知这位牛人的博客的?有没有他的微博?
      

  10.   

    javascript中this所指向的对象,取决于调用它的对象和作用域范围,也就是说,谁调用它,它就指向谁。
    不要和java,c#这些编程语言中的this,及函数引用(传的是个地址)混淆了.首先要明白这俩段代码getNameFunc执行完结后,回到全局作用域,this都是指向window对象区别就在于第2段代码getNameFunc执行完毕后,用了临时变量that把那时那刻的this对象给缓存了起来.并没有因为getNameFunc函数的执行完毕被而释放,所以他一在object的作用域范围内.并指向调用它object对象,getNameFunc函数的执行完毕that为什么没释放?这就是闭包的特性和作用就在于此。
      

  11.   

    都理解,感觉都无需扣什么闭包概念,用多了自然而然
    第一个 object的方法返回一个匿名函数,那儿获得返回值后与object就无关了,分成两个过程就好理解了:
    1.调用方法,获得返回值,是一个函数;
    2.在该位置执行一个函数,所以里面this不会指代object,函数中this指代window,故访问到全局变量
    第二个在方法函数中把this用局部变量保存下来,匿名函数中使用该局部变量当然指代object,所以访问到object的属性
      

  12.   

    这个主要讲的是js的作用域链和执行环境还有活动对象的理解,JavaScript高级程序设计(第2版)我记得是在第六章还是第七章有深刻的讲解(我就不抄书的原话了)而且例子也用的这个例子讲的闭包
      

  13.   

    第一个this是window对象,
    第二个that是object对象,闭包了,
    这个还是作用域链的问题。。 this理解清楚就好了,我是扯不清楚-,-
      

  14.   

    要理解闭包必须得理解作用域链当访问一个变量时,js解释器首先在本函数中寻找,有则使用没有则寻找其外层函数中的变量,直到寻找到window每一个函数都有一个[scope]属性,其保存着作用域链,作用域链又有很多属性,分别指向了从内到外各个函数的变量对象,而各个函数的变量对象又分别保存了各个函数的属性对于普通的变量,当访问这个变量时,js解释器就沿着作用域链寻找这个变量,首先访问[scope].1即最内侧函数中的某变量,找不到,再访问[scope].2直到找到window对于this,当访问this对象时,js沿着作用域链寻找会出现一些问题,可能寻找不到外层函数中的this对象,而直接寻找到了window中的this为了能正常寻找到某外层函数中的this,可以把外层函数中的this对象赋值给一个普通的变量,例如that,从而可以在内层函数中通过访问that继而指向了this对象
      

  15.   

    var that = this; 此时that把值固定住了,保存在内存中。而如果仍然用this,则和内存中的值无关,一切都是重新开始。