4.1 变量 作用域 内存问题

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

复制变量值:
基本类型的复制:复制的是值

var num1 = 5;
var num2 = num1;

在这里插入图片描述
引用型变量的复制:复制的是引用,改变其中一个变量,就会影响另一个变量

var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"
 

在这里插入图片描述

改变其中一个变量,就会影响另一个变量:例如

var person = new Object();
person.name = "tyt";
var person2 = person;
console.log(person.name); //tyt
console.log(person2.name);  //tyt
person2.name = "TYT";
console.log(person.name); //TYT
console.log(person2.name); //TYT

4.1.2传递参数
ECMAScript中所有函数的参数都是按值传递的,也就说把函数外部的值复制给函数内部的参数,就相当于把值复制给另一个变量。
很多开发人员错误地认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明
参数是按引用传递的。为了证明对象是按值传递的,我们再看一看下面这个经过修改的例子:

function test (obj) {
	obj.name = "tyt";
	alert(obj.name);  //tyt
	obj = new Object();
	obj.name = "TYT";
	alert(obj.name);  //TYT
	alert(person.name);  //tyt
}
var person = new Object();
test(person);
console.log(person.name); //tyt

说明:我个人比较简单的理解是这样的:如果object对象是按引用(引用地址)传递的,整个过程如下:函数首先传入一个对象引用地址,把这个引用地址的name指向“tyt”,然后再对这个对象进行重定义,把这个对象的引用地址又指向“TYT”,这样最后输出的对象的name应该是“TYT”,但实际却不是。说明这里是按值传递的,obj = new Object();这里相当于var obj = new Object();重新定义一个obj变量对象。仔细理解上面的输出。

4.1.3 对于引用类型的检测
使用instanceof 操作符
对引用类型的检测,我们并不是想知道它是对象,而是想知道它是什么类型的对象,例如

var person = {};
var arr = [];
var reg = /ab/;
console.log(person instanceof Object);//person 是object吗?true
console.log(arr instanceof Array);// arr是 Array吗 true
console.log(reg instanceof RegExp);// reg是RegExp吗  true

4.2.1 执行环境及作用域

每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个变量对象中。
当代码在一个环境中执行时,会创建变量对象的一个作用域链,作用域链的前端始终都是当前执行代码所在环境的变量对象,如果这个环境是函数,则将其活动对象作为变量对象,作用域链中的下一变量对象来自外部(包含)环境,再下一变量来自下一包含环境,作用域链的最后一个变量对象始终是全局执行环境。内部环境可以通过作用域链访问所有的外部环境,但外部环境不可以访问任何的内部变量和函数。只能向上搜索,不能向下搜索。

4.2.1 延长作用域链
这个还是没看懂,只能暂时先记到这。
主要有两种方式:这两个语句都会在作用域链的前端添加一个变量对象。
try catch
with语句

4.2.2 没有块级作用域
例如:
for (var i=0; i < 10; i++){
doSomething(i);
}
alert(i); //10
i在for循环之后仍然存在。

初始化变量没有用var声明时,这个变量将被当做全局变量。
查询标志符时,首先查找局部环境,根据作用域链向上查找,直到全局环境。

4.3.1垃圾收集

垃圾收集机制原理:找出那些不在继续使用的变量,然后释放其所占的内存。垃圾收集器会按照固定的时间间隔周期性的执行这一操作。
标记清除——谷歌
引用计数——IE

谢谢观看,走过路过留下您的足迹,希望点个赞,共同进步。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值