js闭包简单问题,求高人解答,在线等

lurengu 2011-07-20 11:52:59
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:这个算闭包不??
求高手解答。。。在线等。
...全文
422 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
lurengu 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 wind__fantasy 的回复:]

引用 7 楼 lsw645645645 的回复:
JScript code

function Person(name, age) {//name是形式参数
var name = name; //形式参数它是有个存储空间的
name = "CJ2";//改变局部变量
alert(arguments[0]); //输出CJ2,形参被改变,说明他们存储空间地址是相同的
……

晕,……
[/Quote]
当时我没看懂。结果后来解决另一个问题还就靠您这个了。。脸熟了。下次肯定给。。谢谢了
Wind__Fantasy 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lsw645645645 的回复:]
JScript code

function Person(name, age) {//name是形式参数
var name = name; //形式参数它是有个存储空间的
name = "CJ2";//改变局部变量
alert(arguments[0]); //输出CJ2,形参被改变,说明他们存储空间地址是相同的
……
[/Quote]
晕,回答的不对,怎么都得分????
Wind__Fantasy 2011-07-28
  • 打赏
  • 举报
回复
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};
}
所以这是闭包
skyaspnet 2011-07-26
  • 打赏
  • 举报
回复
这个问题并不难理解啊:

问题1: 注意代码中的this关键字,当你var p1 = new Person("CJ",18);时,this就是指向p1;

问题2:不是闭包。
pywepe 2011-07-22
  • 打赏
  • 举报
回复
更正一个

访问了自己作用域之外变量的函数

并不是所有函数都是闭包
pywepe 2011-07-22
  • 打赏
  • 举报
回复
javascript高级程序设计 一书中对闭包有这样的定义:可以访问自己之外作用域变量的函数
pywepe 2011-07-22
  • 打赏
  • 举报
回复
2楼
这就是闭包
  • 打赏
  • 举报
回复
闭包简单理解就是内层函数对外层函数变量, 参数的引用....!
renyiqiu 2011-07-21
  • 打赏
  • 举报
回复
初学者帮顶
豆虫 2011-07-20
  • 打赏
  • 举报
回复
问题1:new的时候会执行Person函数 初始化p1对象的方法 getName (注:这个方法永远返回参数name) setName getAge setAge

问题2:这不是函数的闭包

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

这是闭包。
ZiSheng 2011-07-20
  • 打赏
  • 举报
回复

<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最终变化了。
挨踢直男 2011-07-20
  • 打赏
  • 举报
回复
new Person("CJ",18);
其实跟 Parson()这样直接调用一样
只不过第一个 会创建一个 Object空对象,然后再通过函数包装这个object
只不过第二个那个object换成了 window对象
其实就是一个函数调用,闭包啊
lsw645645645 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lurengu 的回复:]
但我不创建对象只当函数使用那么整个函数执行完成即使内部函数使用到了外面函数的临时变量,这些变量也不会被销毁(论坛上别人说的,因为闭包所以不销毁),但这种机制是有问题的对吧。。。明明都不需要了但临时变量还在。。。虽然个把变量占空间有限、、、
[/Quote]
只要有引用的地方,变量不会销毁的。这种机制我觉得是很合理的呀。临时变量之所以存在,是因为你的需要。因为你有对它的引用。如果你不用它的话,它会自动销毁的啦。。这种临时变量,你不用担心。随着调用它的父亲销毁,它也跟着销毁了。
挨踢直男 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lurengu 的回复:]

引用 8 楼 rainsilence 的回复:

引用 7 楼 lsw645645645 的回复:

JScript code

function Person(name, age) {//name是形式参数
var name = name; //形式参数它是有个存储空间的
name = "CJ2";//改变局部变量
alert(arguments[0]); //输出CJ2,形……
[/Quote]
这种问题很常见的
<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>

你分别试试
JParser 2011-07-20
  • 打赏
  • 举报
回复
像你上面这样的函数,你即使不用作Constructor,也会形成闭包,因为有个this的存在,还是会把往上面绑定这些方法,这时this指向window,所以还是会开成闭包,还是不能回收。这种机制有不好的地方,当然也有好的地方,关键是恰当应用。这种双刃剑的现象很普遍。
lsw645645645 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 rainsilence 的回复:]
引用 7 楼 lsw645645645 的回复:
你说的很清楚了,不过很可惜说错了
这个就是闭包。
function Person(name, age)
这里的两个参数在调用完构造体后本应该被释放,但是由于get,set中有对应的变量,所以未被释放。很明显的闭包用法。
[/Quote]
呵呵,你说的很对,但我觉得闭包是相对与作用域的一个概念,看你在哪个作用域里观察。我的角度是对Person这个对象来说是不是闭包。你的角度是对像里面的东西,有没有形成闭包。里面确实是闭包,你可以随时设置形式参数,类似于设置里面的一个变量一样。但这个闭包在Person回收后,也消失啦,不是吗,它只是里面的一个变量而已,不是么?。
lurengu 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 rainsilence 的回复:]

引用 7 楼 lsw645645645 的回复:

JScript code

function Person(name, age) {//name是形式参数
var name = name; //形式参数它是有个存储空间的
name = "CJ2";//改变局部变量
alert(arguments[0]); //输出CJ2,形参被改变,说明他们存储空间地址是相同的
……

……
[/Quote]
大神来了。和我在还一个论坛上得到的回答有点像。但我不创建对象只当函数使用那么整个函数执行完成即使内部函数使用到了外面函数的临时变量,这些变量也不会被销毁(论坛上别人说的,因为闭包所以不销毁),但这种机制是有问题的对吧。。。明明都不需要了但临时变量还在。。。虽然个把变量占空间有限、、、
lurengu 2011-07-20
  • 打赏
  • 举报
回复
var name = name; //形式参数它是有个存储空间的
name = "CJ2";//改变局部变量
alert(arguments[0]); //输出CJ2,形参被改变,说明他们存储空间地址是相同的
---------------------------------------------------------------------------------------
这个完全木有办法理解。。
koo42636880 2011-07-20
  • 打赏
  • 举报
回复
闭包简单理解就是内层函数对外层函数变量, 参数的引用....!
加载更多回复(7)

87,993

社区成员

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

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