标注:
向参数传递基本类型时:把值从一个变量赋值到另一个变量
传递引用类型时:把这个值在内存中的地址赋值给局部变量
- 函数中基本类型的参数传递
function addTen(num) {
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
console.log(count); //20,没有变化
console.log(result);//30
将count的值传给局部变量num,对num进行加10后返回;count值没有变换
- 函数中的引用类型的参数传递
function setName(obj) {
obj.name = "Nicholas";
}
var person = new Object();
setName(person);
console.log(person.name); //“Nicholas”
将person对象存放的内存地址赋值给obj,所以person和obj指向的是相同的对象。
function setName(obj) {
//将对象1存放的地址赋值给obj,即obj指向对象1
obj.name = "Nicholas"; //将对象1的name属性设置为"Nicholas"
obj = new Object(); //此时obj改变指向,指向新创建的对象2
obj.name = "Greg";//将对象2的name设置为"Greg",不影响对象1的属性值
}
var person = new Object(); //将person指向该对对象1
setName(person);
console.log(person.name); //"Nicholas"
其中这个在函数内部创建的局部变量,在函数执行完毕之后会立即被销毁。
var s = "Nicholas";
var b = true;
var i = 22;
var obj = new Object();
var n = null;
var u;
console.log(typeof s); // string
console.log(typeof n); // object
console.log(typeof i); // number
console.log(typeof obj); // object
console.log(typeof u); // undefined
console.log(typeof b); // boolean
//typeof检测函数时,会返回function,正则表达式值根据浏览器不同结果为object或者function
with语句接收的是location对象,因此变量对象中就包含了location对象的所有属性和方法,而这个变量对象被添加到了作用域链的前端
function buildUrl() {
var qs = "?debug=true";
with(location) {
var url = href + qs;
}
return url;
}
function add(num1, num2) {
var sum = num1 + num2;
return sum;
}
var result = add(10,20);
alert(sum);//由于sum在函数执行之后被销毁,因此会导致错误
补充:
所有变量(包括基本类型和引用类型)都存在于一个执行环境(作用域)当中,这个执行环境决定了变量的生命周期:
- 每次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链。
- 变量的执行环境有助于确定应该在何时释放内存。