在我学习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时,这个变量引用的就是一个局部变量了。而这个局部对象会在函数执行完毕后立即被销毁。