变量、作用域及内存问题

1
2
3
4
var person = new object();
person.name = "hello"; //OK
var person;
person.name = "hello"; //False
1
2
3
var obj1 = new object();
var obj2 = obj1;
obj1.name = "lucy"; //obj2.name = lucy
1
2
3
4
5
6
7
8
function addTen(num){
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert (count); //20
alert (result); //30
1
2
3
4
5
6
7
8
function setName(obj){
obj.name = "lucy";
obj = new object();
obj.name = "lily";
}
var person = new object();
setName(person);
alert (person.name); //lucy

第一个基本类型的实例中,num是一个局部变量,所以在函数中,count值传给num,所以count本身的值不会改变,函数结束后num立即销毁。
第二个引用类型的实例则需要理解一下,引用类型在复制和传递过程中,副本是一个指针,所以说person.name指向obj.name,但是函数内部在重写obj时,变量的引用是局部对象,到函数外的时候,就会立即销毁,所以函数内部重写obj,修改obj.name就不会传递给person.name了。

1
2
3
4
5
6
7
function buildUrl(){
var qs = "?debug = true";
with(location){
var url = href + qs;
}
return url;
}

定义了一个url变量,url就成了函数执行环境一部分,可以作为函数值被返回。

1
2
3
4
5
6
7
8
9
if(true){
var color = "blue";
}
alert(color); //blue
for(var i = 0; i < 10; i++){
doSomething(i);
}
alert(i); //10
1
2
3
4
5
6
var color = 'blue';
function getColor(){
var color = "red";
return color;
}
alert (getColor()); //red,删掉第三行,则为blue
script>