Javascript函数易错点

在我学习Javascript中这些注意事项会逐渐更新。
大家都知道Javascript中函数的值传递和java,c,c++有几分相同吧!!但是,实际情况并不全是这样。在这里100%未看过Javascript的人都会出错!!!!!当然,这不是废话吗。。。。

下面我们来看看这个代码:
function adddTen(num){
    num+=10;
    return num;
}
var count=20;
var result=addTen(count);
alert(count);   //20,没有变化
alert(result);  //30

在这里,我相信大家都会知道,也会嘲笑我白痴。因为我开始也是这样。再看看下面的代码,这次针对的是引用类型。

function setName(obj){
    obj.name="Nicholas";
}
var person=new Object();
setName(person);
alert(person.name);  //"Nicholas"

以上代码中创建了一个对象,并且保存在了person中,然后对象呗传递到setName()函数中之后就被复制给了obj。在这个函数内部,obj和person引用的是同一个对象。换句话说,即使这个对象是按值传递,obj也会按引用来访问同一个对象。于是当obj添加name属性后,函数外部的person也将有所反映。当然到了这里,大家也不会出错。但是下面就是重点:很多开发人员都会错误的认为:在局部作用域中修改的对象会在局部作用域中反映出来。

function setName(obj){
    obj.name="Nicholas";
    obj=new Object();
    obj.name="Greg";
}
var person=new Object();
setName(person);
alert(person.name); //"Nicholas"

好吧,在这里就出错了。 
这个例子与前一个例子的唯一区别就是setName()函数中添加了两行代码:一行代码为obj重新定义了一个对象,另外一行代码为该对象定义了一个带有不同值得name属性。在把person传递给setName()后,其name属性被修改为”Nicholas”。然后,又将一个新对象赋值给变量obj,同时将其name属性设置为”Greg”。如果person是按引用传递的,那么person就会自动修改为指向其name属性值为”Greg”的新对象。但是接下来再访问person.name时,显示的值仍然是”Nicholas”。这说明即使在函数内部修改了参数的值,但原始的引用仍然保持未变。实际上,当在函数内部重写obj时,这个变量引用的就是一个局部变量了。而这个局部对象会在函数执行完毕后立即被销毁。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值