function Person(name,age) {
              this.getName = function () {return name};
              this.setName = function (param) {name=param};
              this.getAge = function () {return age};
              this.setAge = function (param) {age=param};
       }
       var p1 = new Person("CJ",18);
       alert(p1.name);//undefined
       alert(p1.getName());//CJ
       p1.setName("XXX");
       alert(p1.getName());//XXX
问题1:p1应该为引用或者叫指针指向堆中的person对象,堆中person对象应该保存4个函数指针或者叫引用,然后函数应该保存在代码段。
       但创建时候类中没有对应的变量保存cj和18这2个值,因此调用alert(p1.getName());输出cj我就无法理解了。个人觉得name和age是临时变量,创建完毕他们就被销毁了。。还是说定义函数的时候有arguments对象自动保存他们的名字和值?但好像也不对,arguments应该随着函数一起产生和销毁吧?
问题2:这个算闭包不??
          求高手解答在线等。

解决方案 »

  1.   

    问题1:new的时候会执行Person函数 初始化p1对象的方法 getName (注:这个方法永远返回参数name) setName getAge setAge问题2:这不是函数的闭包
      

  2.   

    我觉得这个是闭包。
    name是临时变量,但是getName要用到name,而且getName已经被p1引用,所以在执行完var p1 = new Person("CJ",18)后,name始终存在。
     
      

  3.   

    这个就是闭包。name,age在这里就是运行环境,所以能在里面使用
      

  4.   


    function Person(name, age) {//name是形式参数
            var name = name; //形式参数它是有个存储空间的
            name = "CJ2";//改变局部变量
            alert(arguments[0]); //输出CJ2,形参被改变,说明他们存储空间地址是相同的               
            this.getName = function () { return name };//这里返回的只是name那个存储空间的值,当Person消失时,存储空间也就回收了
            this.setName = function (param) { name = param };
            this.getAge = function () { return age };
            this.setAge = function (param) { age = param };
            
        }说的简单点,就是形式参数 你把它想成 里面有个和它名字相同的变量存储了它。访问这个参数,就是访问那个变量而已。。这种应该不算是闭包。。这个变量是同构造Person的时候生成的,也随着Person的回收而回收。
    不知道说清楚没有。
      

  5.   

    你说的很清楚了,不过很可惜说错了
    这个就是闭包。
    function Person(name, age)
    这里的两个参数在调用完构造体后本应该被释放,但是由于get,set中有对应的变量,所以未被释放。很明显的闭包用法。
    另外ECMAScript5标准就是基于这种特性,而开发了几个新功能,比如defineProperty等
      

  6.   

     var name = name; //形式参数它是有个存储空间的
            name = "CJ2";//改变局部变量
            alert(arguments[0]); //输出CJ2,形参被改变,说明他们存储空间地址是相同的    
    ---------------------------------------------------------------------------------------
    这个完全木有办法理解。。
      

  7.   

    呵呵,你说的很对,但我觉得闭包是相对与作用域的一个概念,看你在哪个作用域里观察。我的角度是对Person这个对象来说是不是闭包。你的角度是对像里面的东西,有没有形成闭包。里面确实是闭包,你可以随时设置形式参数,类似于设置里面的一个变量一样。但这个闭包在Person回收后,也消失啦,不是吗,它只是里面的一个变量而已,不是么?。
      

  8.   

    像你上面这样的函数,你即使不用作Constructor,也会形成闭包,因为有个this的存在,还是会把往上面绑定这些方法,这时this指向window,所以还是会开成闭包,还是不能回收。这种机制有不好的地方,当然也有好的地方,关键是恰当应用。这种双刃剑的现象很普遍。
      

  9.   

    这种问题很常见的
    <p>1</p>
    <p>1</p>
    <p>1</p>
    <p>1</p>
    <p>1</p>
    <p>1</p>
    <script>
    var p  = document.getElementsByTagName("p")
    for(var i = 0 ; i < p.length ; i ++)
    {
       p[i].onclick = function()
    {
      alert("第"+(i+1)+"个p")
    }
    }
    </script>
    <p>1</p>
    <p>1</p>
    <p>1</p>
    <p>1</p>
    <p>1</p>
    <p>1</p>
    <script>
    var p  = document.getElementsByTagName("p")
    for(var i = 0 ; i < p.length ; i ++)
    {
       p[i].onclick = function(i)
    {
      return function(){  alert("第"+(i+1)+"个p")}
    }(i)
    }
    </script>
    你分别试试
      

  10.   

    new Person("CJ",18);
    其实跟 Parson()这样直接调用一样
    只不过第一个 会创建一个 Object空对象,然后再通过函数包装这个object
    只不过第二个那个object换成了 window对象
    其实就是一个函数调用,闭包啊
      

  11.   


    <p>1</p>
    <p>1</p>
    <p>1</p>
    <p>1</p>
    <p>1</p>
    <p>1</p>
    <script>
    var p  = document.getElementsByTagName("p")
    for(var i = 0 ; i < p.length ; i ++)
    {
       p[i].onclick = function()
    {
      alert("第"+(i+1)+"个p")
    }
    }
    </script>这个从本质上讲,也是闭包,不过是包错了,包里的i最终变化了。
      

  12.   

    代码和作用域的综合体叫做闭包。
    所有的JavaScript函数都是闭包。
    这是一种常用编程技术,就是把属性变为私有的,并且只通过专门的accessor方法才能读取和写入它们。这是闭包。
      

  13.   

    javascript高级程序设计 一书中对闭包有这样的定义:可以访问自己之外作用域变量的函数
      

  14.   

    这个问题并不难理解啊:问题1: 注意代码中的this关键字,当你var p1 = new Person("CJ",18);时,this就是指向p1;问题2:不是闭包。
      

  15.   

    javascript高级程序设计 第二版 P144 说 闭包是指有权访问另一个函数作用域中变量的函数function Person(name,age) {
      this.getName = function () {return name}; // 函数, 并且访问了另一函数(Person)作用域的变量(name)
      this.setName = function (param) {name=param};
      this.getAge = function () {return age};
      this.setAge = function (param) {age=param};
      }
      所以这是闭包