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

hztgcl1986 2011-11-29 04:15:29

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何时会被垃圾收集器回收?
...全文
157 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Legend1988 2011-11-29
  • 打赏
  • 举报
回复
JS的作用域是静态的,当定义一个function时,function的作用域是定义function时所在的作用域,而不是调用function时所在的作用域。

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

在function圈套定义时,如果里面定义的function被保存了下来(如:赋给一个全局变量)。那么它所在的作用域(调用外面function时所创建的作用域)也必须一起保存下来(也就是说外面function执行结束时这个调用时所创建的作用域不会被系统回收,要等到保存下来的function被系统回收时系统一起回收)。
作用域保存下来在这个作用域中的所有局部变量当然也都保存了下来。
详细出处参考:http://www.jb51.net/article/5603.htm
yusongkun 2011-11-29
  • 打赏
  • 举报
回复
顶2楼,刚才我也专门试了一次。
1.那个name应该是静态的。
2.不太了解闭包的概念,不过那个name确实是不能改动的了
3.js应该是按照堆栈的方式对数据进行处理的,如果变量失去了作用域,就会被回收
liangws 2011-11-29
  • 打赏
  • 举报
回复
1、这里已经跳出了Person,为什么还能访问name?
静态作用域是在函数定义的时候创建的

2、是不是形成闭包了?


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

licip 2011-11-29
  • 打赏
  • 举报
回复
p.sayName();
//1、这里已经跳出了Person,为什么还能访问name?
没有跳出吧。

87,901

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧