+ -
当前位置:首页 → 问答吧 → 关于在函数外访问函数内的变量

关于在函数外访问函数内的变量

时间:2011-11-29

来源:互联网

JScript code

function Person(name, age, job)
{
    var o = new Object();
    o.sayName = function()
    {
        window.alert(name);
    }
    
    return o;
}

var p = Person("hzt", 26, "Programmer");

p.sayName(); 
//1、这里已经跳出了Person,为什么还能访问name? 
//2、是不是形成闭包了?
//3、变量name和age、job何时会被垃圾收集器回收?

作者: hztgcl1986   发布时间: 2011-11-29

p.sayName(); 
//1、这里已经跳出了Person,为什么还能访问name? 
没有跳出吧。

作者: licip   发布时间: 2011-11-29

1、这里已经跳出了Person,为什么还能访问name? 
静态作用域是在函数定义的时候创建的

2、是不是形成闭包了?


3、变量name和age、job何时会被垃圾收集器回收?
没有引用的时候就会被垃圾回收

作者: liangws   发布时间: 2011-11-29

顶2楼,刚才我也专门试了一次。
1.那个name应该是静态的。
2.不太了解闭包的概念,不过那个name确实是不能改动的了
3.js应该是按照堆栈的方式对数据进行处理的,如果变量失去了作用域,就会被回收

作者: yusongkun   发布时间: 2011-11-29

JS的作用域是静态的,当定义一个function时,function的作用域是定义function时所在的作用域,而不是调用function时所在的作用域。 

当调用一个function时,就会创建一个新的作用域,在这个作用域中用var定义的变量就是局部变量,一般情况下function执行结束之后这个调用时所创建的作用域就会被系统回收。 

在function圈套定义时,如果里面定义的function被保存了下来(如:赋给一个全局变量)。那么它所在的作用域(调用外面function时所创建的作用域)也必须一起保存下来(也就是说外面function执行结束时这个调用时所创建的作用域不会被系统回收,要等到保存下来的function被系统回收时系统一起回收)。 
作用域保存下来在这个作用域中的所有局部变量当然也都保存了下来。
详细出处参考:http://www.jb51.net/article/5603.htm

作者: Legend1988   发布时间: 2011-11-29

相关阅读 更多