当n,person执行完之后离开了js的执行环境,浏览器的垃圾收集器下次运行时将其销毁,就当他已经销毁。
但是这儿还能调用的原因时,当运行peron("qzh")时,n以函数值的形式返回并赋值给stu1,stu2,相当于stu1有了n的一份拷贝,所以可以被调用。
如果真正的不能被调用,就需要显式的解除这个引用。
stu1 = null;那以后的方式就不能被调用,不能调用就会报错,从而中止程序的执行。function peron(name){
    var n = new Object;
    n.sayname = function(){
        return name;
    }
    n.setname = function(newname){
        name = newname;
    }
    return n;
}
var stu1 = peron("qzh");
var stu2 = peron("xxx");
stu1 = null;
alert(stu1.sayname()); // TypeError : stu1 is null
stu2.setname("wo");
alert(stu2.sayname());扩展阅读:js的垃圾回收机制

解决方案 »

  1.   


    我想问的是   调用完stu1=peron("qzh")  执行一遍那个函数  n能返回这我知道
     但是为什么stu1.sayname()还能有用  name在执行一遍函数完之后 不应该销毁吗
    而且stu1.setname()也能修改  都能正常输出  
      

  2.   

    这是js的闭包和作用域的原理。如果你想深入学习js,推荐你看《javascript高级程序设计》。个人认为,不懂闭包、作用域等高级主题的人不应该称作会js。
      

  3.   

    我想问的是   调用完stu1=peron("qzh")  执行一遍那个函数  n能返回这我知道
     但是为什么stu1.sayname()还能有用  name在执行一遍函数完之后 不应该销毁吗
    而且stu1.setname()也能修改  都能正常输出  

    销毁的是n,但是stu1又复制了一份n的拷贝,所以他有n的行为。n被销毁了,stu1还在作用域内,所以可以调用方法。
    stu1被显式的设为null之后就不能被调用了,意思就是n的拷贝也被销毁了。