标题:代码中Var name和this.name是否是指向同一地址
只看楼主
dddebug
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-9-28
结帖率:100%
已结贴  问题点数:20 回复次数:4 
代码中Var name和this.name是否是指向同一地址
程序代码:
<!DOCTYPE html>
<html>
<body>
<script>
/**
*在函数person中var name和this.name是否指向同一地址,当通过var name="ceshi"给name赋值之后再用this.name=name对name赋值 会发现name的值并没有改变依然是“ceshi”
*请高手解释下var声明的name和this.name的关系,以及代码执行结果的说明,
*/
function person(name,age)
{
    var name="ceshi";//
    var age;
    
    this.name=name;
    this.age=age;
    
    document.write("1-name = "+name+"<br/>");
    document.write("2-age = "+age+"<br/>");
     document.write("3-this name = "+this.name+"<br/>");
    document.write("4-this age = "+this.age+"<br/>");
    
    this.changeName=changeName;
    
    function changeName(name)
    {
        this.name=name;
    }
}
    m=new person("Sally",48);
    document.write("5-name = "+m.name+"<br/>");
    
    m.changeName("Doe");
    document.write("6-name = "+m.name);
</script>

</body>
</html>


[ 本帖最后由 dddebug 于 2015-9-28 16:01 编辑 ]
搜索更多相关主题的帖子: person 
2015-09-28 15:50
dddebug
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-9-28
得分:0 
在函数初始化执行到m=new person("Sally",48)时,执行this.name=name 这时name的直应该是Sally 但结果 name的值并没有改变:
1-name=ceshi
2-age=48
3-name=ceshi
4-age=48
5-name=ceshi
而当调用内部函数m.changeName("Doe")后,name的值竟然改变了
6-name=Doe
函数person内部通过var声明的name和this.name两个变量是什么关系,内部函数changeName中的this.name又是指向哪里的?

当var 一个空变量name执行函数会得到另一个结果 有没有高手解释下变量底层的关系
2015-09-28 16:16
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:14 
程序代码:
<!DOCTYPE html>
<html>
<body>
<script>
/**
*在函数person中var name和this.name是否指向同一地址,当通过var name="ceshi"给name赋值之后再用this.name=name对name赋值 会发现name的值并没有改变依然是“ceshi”
*请高手解释下var声明的name和this.name的关系,以及代码执行结果的说明,
*/
function person(name,age)
{
    //var name="ceshi";//
    //var age;
    
    this.name=name;
    this.age=age;
    
    document.write("1-name = "+name+"<br/>");
    document.write("2-age = "+age+"<br/>");
     document.write("3-this name = "+this.name+"<br/>");
    document.write("4-this age = "+this.age+"<br/>");
    
    this.changeName=changeName;
    
    function changeName(name)
    {
        this.name=name;
    }
}
    m=new person("Sally",48);
    document.write("5-name = "+m.name+"<br/>");
    
    m.changeName("Doe");
    document.write("6-name = "+m.name);
</script>

</body>
</html>

问题在于你的对象属性和局部变量重名,优先级高者获得处理权限

剑栈风樯各苦辛,别时冰雪到时春
2015-09-28 17:55
dddebug
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-9-28
得分:0 
实际开发中肯定会避免出现重名问题,重名只是为了测试学习变量作用域和this指针指向地址,终于搞明白了
程序代码:
    var name=0;
function myFunction(x)
{
    var name="fin name";
    this.name=x;
    document.write("this name="+this.name+"<br/><br/>");
    document.write("var fin name="+name+"<br/><br/>");
}
    document.write("执行函数前 name="+name+"<br/><br/>");
    document.write("执行函数前 this name="+this.name+"<br/><br/>");
    
    myFunction(2);
    //m=new myFunction(3);
    document.write("执行函数后 name="+name+"<br/><br/>");
    document.write("执行函数后this name="+this.name+"<br/><br/>");
    //document.write("执行函数后m. name="+m.name+"<br/><br/>");


如果执行myFunction 而不是new 一个myFunction() 则函数里面的this指向了外部的全局变量而不是内部定义的重名变量name,执行this.name=x时,函数内部的局部变量并不会改变,而是外部的name发生改变
执行完结果如下:
执行函数前 name=0

执行函数前 this name=0

this name=2

var fin name=fin name

执行函数后 name=2

执行函数后this name=2

当new一个function时,就开辟了一个新的地址空间,外面的全局变量和里面的局部变量都不会受影响,依然保持不变
执行代码结果如下:
执行函数前 name=0

执行函数前 this name=0

this name=3

var fin name=fin name

执行函数后 name=0

执行函数后m. name=3
2015-09-28 19:07
冰镇柠檬汁儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:北京
等 级:版主
威 望:120
帖 子:8074
专家分:6657
注 册:2005-11-7
得分:0 
很不错,学习精神应该鼓励
习惯上,需要用new关键字创建对象的函数,比如person,首字母用大写,是一般的惯例,用来区分所谓的类和对象
这只是个建议

本来无一物,何处惹尘埃
It is empty at all here, Why pm 2.5 is so TMD high!
2015-09-28 22:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-457744-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.115802 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved