3 JavaScript变量、作用域和内存问题

目录

 

3.1 基本类型和引用类型的值

3.1.1 动态属性

3.1.2 复制变量值

3.1.3 传递参数

3.1.4 检测类型

3.2 执行环境和作用域

3.2.1 延长作用域链

4.2.2 没有块级作用域


3.1 基本类型和引用类型的值

1 ES中有两种不同的数据类型,即基本类型值和复杂数据类型(由多个值构成的对象)。前者是按值访问的,后者是按引用访问的。

3.1.1 动态属性

引用类型值能动态地添加属性,而基本类型值不能添加动态添加属性。

3.1.2 复制变量值

1 内存

基本类型值:在内存中占据固定大小的空间,保存在栈内存中。

引用类型:包含引用类型的变量实际上包含的并不是对象本身,而是一个指向该对象的指针。其中对象保存在堆内存中,其对象指针保存在栈内存中。

2 变量的复制

如果变量是

1)基本类型值:复制时,会创建这个值的一个副本。并且两个变量是相互独立的,可以参与任何操作相互之间没有影响。

2)引用类型值:复制的是指针,因此两个变量都指向同一个对象。改变其中一个变量,就会影响另外一个变量。

3.1.3 传递参数

在ES中,传递的参数都是按值传递的。在传递参数的时候,

1)如果传递的是基本类型的值,被传递的值就会复制给函数的局部变量;

2)如果是引用类型值,则会把这个值在内存中的地址复制给一个局部变量。

3.1.4 检测类型

1 两个检测方法:

1)typeof:可以确定一个值是哪种基本数据类型

2)instanceof:确定一个值是哪种引用类型

如果变量是给定引用类型的实例,则返回true。如果检测的是基本数据类型值,则会返回false。

var result = variable instanceof constructor;

3.2 执行环境和作用域

1 所有的变量都存在于一个执行环境(也称作用域)中,这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。

1)执行环境分:全局执行环境(全局环境)和函数执行环境

2)每次进入一个新的执行环境,都会创建一个用于搜素变量和函数的作用域链

3)全局环境只能访问全局环境中的变量和函数

4)变量的执行环境有利于何时释放内存

3.2.1 延长作用域链

1 try-catch语句中的catch块

创建一个新的变量对象,其中包含被抛出的错误对象的声明。

2 with语句

将指定的对象添加到作用域链中。

3.2.2 没有块级作用域

注意在块级中定义的变量,在在当前的执行环境中块级以外也能访问。

"use strict";
var a = 21;
function f() {
    var b = a;
    console.log(b);    //输出21,函数内部的执行环境可以通过作用域访问外部执行环境中的属性和方法
    for(var i = 0; i < 2; i++){
        console.log(i);
    }
    console.log(i);     //输出2,这里不会报错。因为ES中没有块级作用域,i是函数f()作用域中的属性
}
f();

如果有错,欢迎指出。

参考:《JavaScript高级程序设计 第3版》 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值