第二章 变量和做用域
在看第二章时我但愿,你可以回想一下前一次所讲的内容 假设有所遗忘
点这里
今天咱们来讲说 变量和做用域的问题
本章主要内容
- 基本类型和引用类型
- 运行环境
- 垃圾回收(了解就能够)
基本类型和引用类型
JS中可能包括两种不一样的数据类型的值:
基本类型 和 引用类型 基本类型值 指的是简单的数据段 而 引用类型指那些可能由多个值构成的对象。
怎样定义基本类型值和引用类型值呢? 看如下
建立一个变量并给它赋值就OK了。
对于引用类型咱们可以加入 和删除它的属性和方法
var csdn = new Object();
csdn.blog = "Tomihaohao";
alert(csdn.blog) // Tomihaohao
var name ="csdn";
name.age = 123;
alert(name.age) //undefined
//相同的一段方式的代码为何 结果不同呢?
在JS中仅仅能给引用类型的值加入动态的属性
咱们在看一段代码
var a =1;
var b = a;
alert(b);
//-------------------------------------
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "csdn";
alert(obj2.name) //"csdn"
//知道上面两段代码在解析器里发生什么了吗?
两张图帮你解释清楚
传递參数:
还记得上一章讲的函数的參数吗? 咱们来回想一下JS 中的函数 參数是很是灵活的,还记得arguments[] 吗? 假设你忘记了
点击这里
今天我要在来讲一说JS中的參数
请记住
JS 中函数的參数都是按值传递的
还记得我上面画的图吗? 是的 把函数外部的值复制给函数内部的參数,就和把值从一个变量拷贝到还有一个变量同样
function addnum(param){
num +=10;
return num;
}
var a = 10;
var b = addnum(a);
alert(a); //10
alert(b); //20
//看 他们两个是互不影响的
有人可能会疑问 拿要是引用类型仍是这样吗?
function setObj(obj){
obj.name = "csdn";
obj = new Object();
obj.name = "Tomihaohao"
}
var T = new Object();
setObj(T);
alert(T.name);
//是什么呢? 没错依旧是csdn
//实际上这个局部对象,在函数运行完后就被kill了
新的工具 instanceof
记得上一章给你们介绍了一个 type of sth 对 就是 typeof 这个工具
但是 假设你遇到了引用类型又该怎么办呢?因为typeof 返回的都是object.
这里给你们介绍 instanceof 详细的使用方法也很是easy
var person = []
alert(person instanceof Array)
//person 是 Array对象吗? 固然是!
运行环境和做用域
在javascript 中最重要的一个概念:运行环境!
- 运行环境定义了变量和函数有权訪问的其它数据,决定了它们各自的行为
- 每个运行环境都有一个与之关联的 变量对象
- 在浏览器中 window 对象是全局运行环境,它们仅仅有在应用退出时才干销毁
- 每个函数都有本身的运行环境
- 代码在一个环境运行时,会建立对象变量的一个做用域
- 标识符解析是沿着做用域一级一级的搜索标识符的过程
var color = "white";
function changeColor(){
var anotherColor = "red";
function swapColors(){
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
//这里可以訪问 color anotherColor tempColor
}
swaoColors();
//这里可以訪问color anotherColor
}
changeColor();
//仅仅能訪问到color
上面的代码一共同拥有三个运行环境,各自是全局环境 changeColor() 局部环境 swapColors() 局部环境,全局环境中有一个变量 color 而在 changeColor()中 有 anotherColor这个变量和 swapColors()这个函数,在swapColors()中有一个tempColor,至于为何有的地方訪问不到呢?
做用域链就是,内部环境可以经过它去訪问所有外部环境,但反过来确实不行的,每个环境都可以向上搜索做用域链,来查询变量和函数,但是他们不能向下搜索
记住JS中没有块级做用域
javascript 和 C JAVA C#不同他是没有本身的块级做用域的,固然你可以经过一些方法来模拟,这个咱们后面会讲到。
for(var i =0 ;i<10;i++)
{
console.log(i);
}
alert(i); //i=10
假设是JAVA 那么变量i会被立刻销毁,但在JS中呢!依旧存在
js 中查询标识符
var color ="blue";
function getColor(){
//var volor ="red";
return color;
}
alert(getColor()) //blue
//假设去掉 getColor()中的凝视 那么返回的就是red
没错,在js中 标识符会沿着做用域逐级的网上搜索,直到找到为止
浏览器中的GC 垃圾回收
事实上这里你们仅仅要知道一个概念便可了,那就是 解除引用。
一旦数据再也不实用,最好将其设置为null来释放其引用
//向这样
var a ="csdn ";
//没用啦
a = null
//解除引用
总结
- 从一个变量拷贝到还有一个变量的 详细过程,会建立这个值的副本
- 引用类型的值是对象,保存在堆内存中
- 引用类型值的变量事实上是一个指针
- 引用类型的复制实质上是复制了一个指针他们同一时候指向同一个对象
- 学习了新的工具instanceof
- 学习了做用域链
- 了解了GC