注册 登录
编程论坛 JavaScript论坛

代码中Var name和this.name是否是指向同一地址

dddebug 发布于 2015-09-28 15:50, 1887 次点击
程序代码:
<!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 编辑 ]
4 回复
#2
dddebug2015-09-28 16:16
在函数初始化执行到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执行函数会得到另一个结果 有没有高手解释下变量底层的关系
#3
林月儿2015-09-28 17:55
程序代码:
<!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>

问题在于你的对象属性和局部变量重名,优先级高者获得处理权限
#4
dddebug2015-09-28 19:07
实际开发中肯定会避免出现重名问题,重名只是为了测试学习变量作用域和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
#5
冰镇柠檬汁儿2015-09-28 22:50
很不错,学习精神应该鼓励
习惯上,需要用new关键字创建对象的函数,比如person,首字母用大写,是一般的惯例,用来区分所谓的类和对象
这只是个建议
1