JavaScript 函数参数传递问题?

同样都是值传递为什么可以给对象加属性? 还有后面的var obj是把前一个obj覆盖了吗?

还有这里

左边错误没有输出。右边正常,变量声明放在使用的后面只有值类型的变量可以吗?

1 同样都是值传递为什么可以给对象加属性?
当参数为对象是,就不只是值传递而是引用传递了。所以楞以通过obj.name改变原对象的属性。

2 还有后面的var obj是把前一个obj覆盖了吗?
是的,当你再次var obj=new Object()的时候,会让js引擎将obj作为一个新的变量,参数obj在后面的代码中已经无效了。

3 左边错误没有输出。右边正常,变量声明放在使用的后面只有值类型的变量可以吗?
在js中,变量的声明永远都需要放在变量使用前,右边的结果参见上面2的说明。左边出错,是因为在执行到kk.name = 5的时候,会先检查变量kk是否存在,若不存在,当然不能调用它的name属性了,所以后面的代码都不会再执行。而在右边,kk=5相当于var kk = 5;所以可以在后面使用alert(kk)输出,但是再后面的代码 var kk 则会覆盖前面的kk变量(也就是说kk不再是5,而是一个新的变量了)。追问

2,3能懂了,可1,JavaScript高级程序设计里说ECMAScript中所有的函数参数都是按值传递的啊。不过它还说就算是按值传递的,obj也会按引用来访问一个对象。可不可以按c语言的指针来理解,把指针的值也就是保存的地址传给函数,然后函数里的obj使用时就是引用内存里的那个地址,后面重新声明的话,就使obj指向后面objec的地址了?

追答

是这样理解的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-15
1,javascript是可以自由的给对象增加属性。但是这个对象应该是基本数据类型。也就是说应该是Object类型的对象增加属性。像“10”(字符串),10(数字)不可以。后面的obj确实是将前面的obj覆盖了。
2.左边错误原因是执行kk.name的时候,kk还是undefined,所以给undefined增加属性是不能够的。
右边,执行kk的时候kk未定义,但是给kk赋值为5.所以是正确的。
第2个回答  2014-11-15
右边的意思就是你穿一个对象进来,那么自然就可以对该对象进行赋值了,然后有重新 NEW 一个对象,将传进来的对象替换了。本身就是对象,所以就可以给他的属性赋值了。
第3个回答  2014-11-15

    function set2(persen2){},此函数中 执行set2(persen2)这条语句,persen2是函数set2()的内部属性;    后面alert(persen2)返回undefined,persen2是第5行定义的外部全局变量。

    function set(obj){} ,此函数类同上一个,set(persen),的persen对象是外部对象传入内部,内部为此对象添加了name属性且赋值“like”。  

    函数内部的var obj不会覆盖前一个,作用阈不同,只在set()函数内部可用。

    左侧var kk=new Object();创建对象没有定义name属性,在alert(kk.name)提示name是undefined。

    kk是全局变量,后面定义var kk;也是全局变量。