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:这个算闭包不??
求高手解答在线等。
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:这个算闭包不??
求高手解答在线等。
name是临时变量,但是getName要用到name,而且getName已经被p1引用,所以在执行完var p1 = new Person("CJ",18)后,name始终存在。
function Person(name, age) {//name是形式参数
var name = name; //形式参数它是有个存储空间的
name = "CJ2";//改变局部变量
alert(arguments[0]); //输出CJ2,形参被改变,说明他们存储空间地址是相同的
this.getName = function () { return name };//这里返回的只是name那个存储空间的值,当Person消失时,存储空间也就回收了
this.setName = function (param) { name = param };
this.getAge = function () { return age };
this.setAge = function (param) { age = param };
}说的简单点,就是形式参数 你把它想成 里面有个和它名字相同的变量存储了它。访问这个参数,就是访问那个变量而已。。这种应该不算是闭包。。这个变量是同构造Person的时候生成的,也随着Person的回收而回收。
不知道说清楚没有。
这个就是闭包。
function Person(name, age)
这里的两个参数在调用完构造体后本应该被释放,但是由于get,set中有对应的变量,所以未被释放。很明显的闭包用法。
另外ECMAScript5标准就是基于这种特性,而开发了几个新功能,比如defineProperty等
name = "CJ2";//改变局部变量
alert(arguments[0]); //输出CJ2,形参被改变,说明他们存储空间地址是相同的
---------------------------------------------------------------------------------------
这个完全木有办法理解。。
<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>
你分别试试
其实跟 Parson()这样直接调用一样
只不过第一个 会创建一个 Object空对象,然后再通过函数包装这个object
只不过第二个那个object换成了 window对象
其实就是一个函数调用,闭包啊
<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最终变化了。
所有的JavaScript函数都是闭包。
这是一种常用编程技术,就是把属性变为私有的,并且只通过专门的accessor方法才能读取和写入它们。这是闭包。
this.getName = function () {return name}; // 函数, 并且访问了另一函数(Person)作用域的变量(name)
this.setName = function (param) {name=param};
this.getAge = function () {return age};
this.setAge = function (param) {age=param};
}
所以这是闭包