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

4次阅读

共计 1471 个字符,预计需要花费 4 分钟才能阅读完成。

1、基本类型和引用类型的值
* 基本类型:指的是简单的数据段,五种基本类型是按值访问的,可以直接操作保存在变量中实际的值。
* 引用类型:指那些可能由多个值组成的对象,引用类型的值是保存在内存中的对象,js 不允许直接访问内存中的位置,也就是不可直接操作对象的内存空间。
操作对象实际是操作对象的引用而不是实际的对象,引用类型的值按引用访问。2、动态的属性引用类型的值可以添加属性和方法,也可以删除和修改,但基本类型不行。// 引用类型
var person = new Object();
person.name = “sheyurong”;
alert(person.name); //sheyurong

基本类型添加属性也不会报错。// 基本类型
var name = “sheyurong”
name.age = 27;
alert(name.age) ; //undefined

3、赋值变量值
// 基本类型
var num1 = 5;
var num2 = num1;
// num1 与 num2 中的 5 完全独立,参与任何操作也不会相互影响

// 引用类型
var obj1 = new Object();
var obj2 = obj1;
obj1.name = “syr”;
alert(obj.name); //”syr”;
改变其中任一变量也会影响另一个,因为两个变量引用同一变量。

4、传递参数 es 中所有函数的参数都是按值传递的,基本类型与引用类型的传参与变量的复制一样。
function setName(obj){
obj.name = “syr”;
obj = new Object();
obj.name = “abc”
}
var person = new Object();
setName(person);
alert(person); // “syr”
// 可以把函数的传参想象成局部变量一样

5、检测类型 typeof 可以检测基本类型,但检测对象时并不能知道是什么类型的对象,因此,使用 instanceof 操作符。语法:
result = variable instanceof constructor// 如果变量为引用类型的实例,则 instanceof 返回 true 例:person instanceof Object; // person 是 Object 的实例吗?根据规定,所有引用类型都是 object 的实例,instanceof 检测基本类型,适中返回 false,因为基本类型不是对象。
6、执行环境及作用域
* 执行环境决定了变量或函数有权访问的其他数据,决定了她们各自的行为。
* 每个执行环境都有一个环境变量对象,所有变量和函数都保存在这里面,无法访问,但是后台会使用它。
* 全局变量是最外围的一个执行环境,代码在环境中执行,会创建一个作用域链,用途是保证对执行环境有权访问所有变量和函数的有序访问。
* 作用域链:如环境是函数,则最开始只包含有一个变量 -arguments 对象 -> 外部环境 1 -> 外部环境 2 … -> 全局。
作用域链中最后一个对象始终是全局执行环境。
* 内部环境可以通过作用域链访问所有的外部环境,外部则不能访问内部。函数参数的访问规则与执行环境其他变量相同。

7、延长作用域链
* 使用 try-catch 语句的 catch 块;
* with 语句:
都是会在作用域链的前端添加一个变量对象,with 可将制定对象添加到作用域链中。catch 创建新变量,内涵跑出的错误对象声明。
例:function build(){
var qs = ‘aaa’;
with(location){
var url = href + qs;
} return url ;
}
//with 吧 location 对象引入,此种就包含了 location 中所有属性和方法。

正文完
 0