javascript 红宝书笔记之函数变量参数作用域与内存问题
Posted 礼拜16
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript 红宝书笔记之函数变量参数作用域与内存问题相关的知识,希望对你有一定的参考价值。
ECMAScript 不介意传进来多少个参数,也不介意传进来的参数类型。
理解参数:
命名的参数只提供便利,不是必需的。
ECMAScript 的变量包含两种不同的数据类型的值。分别是
- 简单的数据构成的基本数据型值,不能给基本型值添加属性:
var name = "kevin";
name.age = 27;
console.log(name.age); //undefined
- 多个值构成的对象,引用类型值.引用类型的值,可以添加动态属性,并可以改变这个动态属性的值或者可以删除这个动态属性的值
var name = new Object();
name.age = 27;
console.log(name.age); //27
ECMAScript 操作对象,实际上是在操作对象的引用而不是实际的对象。
复制变量值
- 基本类型的值
var name = "kevin";
var name2 = name; //name的值是kevin;name2的值同样也是kevin;它们在各自的作用域中参与任何操作都不会互相影响,因为name2是独立的,互不干涉的。
- 引用型值
var name = new Object();
var name2 = name;
name.age = 27;
console.log(name.age); //27 与上面的基本类型的值不同的是,这里的name2实际上是name的一个指针,而这个指针指向name的一个对象,因此,这个name2同样引用的是一个对象,而且与name是同一个对象。
传递参数
ECMAScript中所有的函数的参数都是按值传递的。
- 基本类型的参数传递,按值传递
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量,就是arguments对象中的一个元素。
function add(num){
num = 30;
console.log(num); //这个参数实际上是这个函数的局部变量,它的值仍为30
}
var num2 = 10;
var num3 = add(num2);
console.log(num2); //10
console.log(num3); //40,调用这个函数时,变量num2作为参数被传递给这个函数了。而这个addr()的函数的值为局部变量的值30, 再加上传递进来的值 num2 = 10,最后num3的值为40
- 引用类型的参数传递,按对象传递
换句话说,即使这个变量是按值传递的,被传递的这个值也会按引用来访问同一个对象。也就是说,即使是在函数内部修改了参数的值,但是原始的引用仍然保持不变。
function setName(obj){
obj.name = ‘kevin‘; //obj的默认的name属性值为kevin
obj = new Object(); //为obj重新定义一个新的对象,这个对象为局部对象
obj.name = ‘Greg‘; //为这个新的局部对象定义一个不同值的name属性
}
console.log(obj.name); //kevin, 为什么这里的值是kevin呢,这是因为,实际上,在函数内部重写obj时,这个变量的引用,其实就是一个局部对象了,这个局部对象会在函数执行完毕之后立即销毁
var person = new Object();
setName(person);
console.log(person.name); //kevin
可以把ECMAScript函数的参数想象成局部变量
执行环境
执行环境定义了变量或函数有权访问的其它数据,决定他们的各自行为,每个执行环境都 有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。我们编写的代码无法访问这个对象。
- 全局执行环境,直到应用程序退出,如关闭网页或浏览器时才会被销毁。
每个函数都有自己的执行环境。
var name = ‘kevin‘;
function changeName(){
if(name === ‘kevin‘){
name = ‘page‘;
}else{
name = ‘kevin‘;
}
}
changeName();
console.log("name is now" + name);
以上是关于javascript 红宝书笔记之函数变量参数作用域与内存问题的主要内容,如果未能解决你的问题,请参考以下文章
javascript 红宝书笔记之如何使用对象 如何操作数组
《JavaScript高级程序设计(第四版)》学习笔记第4章