到底哪一种方式属于闭包?

浴火_凤凰 2009-11-05 02:50:27
代码段1:
function Person(firstName, lastName, age)
{
//私有变量:
var _firstName = firstName;
var _lastName = lastName;

//公共变量:
this.age = age;

//方法:
this.getName = function()
{
return(firstName + " " + lastName);
};
this.SayHello = function()
{
alert("Hello, I'm " + firstName + " " + lastName);
};
};

var BillGates = new Person("Bill", "Gates", 53);
var SteveJobs = new Person("Steve", "Jobs", 53);

BillGates.SayHello();
SteveJobs.SayHello();
alert(BillGates.getName() + " " + BillGates.age);
alert(BillGates.firstName); //这里不能访问到私有变量

书上说上面是一个闭包,我怎么感觉上面的红色部分变量使用带下划线的变量代替才是闭包呢。
就像下面这样
function Person(firstName, lastName, age)
{
//私有变量:
var _firstName = firstName;
var _lastName = lastName;

//公共变量:
this.age = age;

//方法:
this.getName = function()
{
return( _firstName + " " + _lastName);
};
this.SayHello = function()
{
alert("Hello, I'm " + _firstName + " " + _lastName);
};
};

var BillGates = new Person("Bill", "Gates", 53);
var SteveJobs = new Person("Steve", "Jobs", 53);

BillGates.SayHello();
SteveJobs.SayHello();
alert(BillGates.getName() + " " + BillGates.age);
alert(BillGates._firstName); //这里不能访问到私有变量

到底哪一种方式属于闭包?
...全文
100 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
moliu 2009-11-06
  • 打赏
  • 举报
回复
刹那间的疑惑!对传入的参数作为内部变量的定义,这种情况,讲 闭包的书中确实没有说过。这说明楼主 思考了,很有创意!其实,内部 私有变量、传递的参数,都是 活动对象的属性,都是作用域的问题。赞一个!
moliu 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gkw521 的回复:]
两个效果一样的。

function Person(firstName, lastName, age){
var firstName=firstName//当firstName以参数传递进来时相当于重新定义了一个firstName
}
所以firstName,_firstName只是两个同样效果的变量。所以产生的闭包也是一样的。
[/Quote]
内部 私有变量、传递的参数,都是 活动对象的属性,地位一样。所以产生闭包的效果一样。同意这位的说法。
natineprince 2009-11-06
  • 打赏
  • 举报
回复
我还是建议笔记中的理解.
闭包的最佳判断标准是有未释放的自由变量.

但其实各语言的闭包都是有一个前提.他们必需支持一级函数(first-class function).
在这个条件下的,语言寻找scope chain中的自由变量时才有可能调用到未释放的自由变量.

所以,闭包问题本来也就是作用域的问题.
gkw521 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kingwolf_javascript 的回复:]
谢谢各位了!!!
明白了,确实是两个效果是一样的,都是没有把变量释放掉。
还有个小疑问:
alert(BillGates._firstName);    //这里应该才算私有变量吧?
alert(BillGates.firstName);    //这里应该算作用域的问题吧?

我对其它语言不太熟悉,请问各位其它语言有闭包机制吗?
如果有,他们是怎样避免闭包导致的内存泄露问题的?

[/Quote]
如之前所说,我感觉两者是等同的。都是私有变量,都是作用域的问题
浴火_凤凰 2009-11-06
  • 打赏
  • 举报
回复
谢谢各位了!!!
明白了,确实是两个效果是一样的,都是没有把变量释放掉。
还有个小疑问:
alert(BillGates._firstName); //这里应该才算私有变量吧?
alert(BillGates.firstName); //这里应该算作用域的问题吧?

我对其它语言不太熟悉,请问各位其它语言有闭包机制吗?
如果有,他们是怎样避免闭包导致的内存泄露问题的?
xiaofan_sap 2009-11-05
  • 打赏
  • 举报
回复
个人理解:闭包是函数中再定义函数时才会出现的问题。内层的函数可以在外层函数终止的情况下引用外层函数的参数,当外层函数有循环变量的时候,内层函数只会引用到改变量的最终值,lz的这个问题应该是作用域的问题 。
gkw521 2009-11-05
  • 打赏
  • 举报
回复
两个效果一样的。

function Person(firstName, lastName, age){
var firstName=firstName//当firstName以参数传递进来时相当于重新定义了一个firstName
}
所以firstName,_firstName只是两个同样效果的变量。所以产生的闭包也是一样的。
natineprince 2009-11-05
  • 打赏
  • 举报
回复
没加下划线的也属于未销毁的.也算哦...
Click_Me 2009-11-05
  • 打赏
  • 举报
回复

而所谓的访问不到firstname是作用域的范畴

natineprince 2009-11-05
  • 打赏
  • 举报
回复
加下划线.
Click_Me 2009-11-05
  • 打赏
  • 举报
回复

闭包就是函数运行时内部产生的独立空间.每产生个函数对象 内部就会保留一份独有的属性列表
与啥下划线无关...

87,993

社区成员

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

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