首页 > 代码库 > javascript小白学习指南1---0

javascript小白学习指南1---0

第二章 变量和作用域

   在看第二章时我希望,你可以回顾一下前一次所讲的内容  如果有所遗忘 点这里

 
 今天我们来说说 变量和作用域的问题

本章主要内容

  • 基本类型和引用类型
  • 执行环境
  • 垃圾回收(了解即可)

基本类型和引用类型

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   具体的用法也很简单

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