JavaScript高级程序设计——第4章 变量、作用域和内存问题

4.1、基本类型和引用类型的值

基本类型值引用类型值
简单的数据段可能由多个值构成的对象
按值访问,可以操作保存在内存当中的实际值不能直接操作对象的内存空间
不能添加属性可以添加、删改属性和方法
复制时,不共享内存复制时,复制的副本实际是个指针,共享内存

参数传递:ECMAScript中所有函数的参数传递都是按值传递,若是参数是基本类型,被传递的值被复制给一个局部变量(arguments对象中的一个元素)。如果参数是对象,看以下两个栗子

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

在函数内部,obj和person引用的是同一个对象,即使这个对象是按值传递,obj也会用引用来访问同一个对象。

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

在函数内部重写obj时,这个变量引用的就是一个局部对象了,局部对象在函数执行完毕后销毁。
检测类型:typeof操作符检测基本数据类型,instanceof操作符检测引用类型

var simpleStr = 'This is a simple string'; 
var myString  = new String();
var newStr    = new String('String created with constructor');
var myDate    = new Date();

simpleStr instanceof String; // returns false,基本类型不是对象 checks the prototype chain, finds undefined
myString  instanceof String; // returns true
newStr    instanceof String; // returns true
myString  instanceof Object; // returns true 所有引用类型的值都是Object的实例

4.2、执行环境(execution context)和作用域

执行环境(execution context)定义了变量或函数有权访问的其他数据,每个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象当中。
标识符解析过程:

image.png

4.2.1延长作用域链

  • try-catch语句的catch块
    在作用域链的前端添加一个变量对象。对catch语句来说,会创建一个新的变量对象,其中包含的是被抛出错误对象的声明。

  • with语句
    在作用域链的前端添加一个人变量对象。对with语句来说,会将指定的对象添加到作用域链中。

location = {
    href:"ss"
};

function buildUrl(){
    var qs = "?debug=true";

    with(location){
        var url = href + qs; //实际上引用的是location.href
    }
    return url;
}
result = buildUrl();
console.log(result); //ss?debug=true

with接收location对象,location对象被添加到作用域链的前端。with语句中,最接近的环境是函数环境,变量url可以返回。

4.2.2 没有块级作用域

  • 由花括号封闭的代码块,不构成执行环境。
for(var i = 0;i < 10;i++){
    ;
}
console.log(i); //10
  • 声明变量
    使用var声明的变量会自动被添加到最接近的环境中。在函数内部,就是函数的局部环境;在with语句中,最接近的环境是函数环境。如果初始化变量的时候没有使用var声明,该变量会自动被添加到全局环境。
  • 查询标识符
    搜索标识符的搜索过程从作用域链的前端开始,向上逐级查询,直至匹配为止。

4.3 垃圾收集

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值