码迷,mamicode.com
首页 > 编程语言 > 详细

javascrip高级程序设计的学习笔记【作用域和执行环境】

时间:2015-04-19 22:44:13      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

javascript变量可以用来保存两种类型的值:基本类型和引用类型。基本类型包括以下5种:undefined、Null、string、Boolean、Number等, 引用类型是object;基本类型和引用类型都具有几下特点:

1、基本类型值在内存中占据固定大小的空间,因此基本类型的值被保存在栈内存中;

2、从一个变量向另一个变量复制基本类型的值,会创建这个值的副本。

3、引用类型的值是对象,保存在堆中;

4、包含引用类型值的变量实际并不是包含对象本身,而是一个指向该对象的指针;

5、从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量始终指的同一个对象;

6、确定一个值是哪种基本类型可以用typeof操作符,而确定一个值是哪种引用类型可以用instanceof操作符‘;

var num1=5;
var num2=num1;
num2=6;
num2;//6
num1;// 5
var  obj1=new Object();
var obj2=obj1;
obj1.name="dd";
alert(obj2.name);//"dd" 指向的是同一个对象;地址相同n
var obj1=new Object();
var obj2=new Object();//两个对象,地址也不一样
var s="ddd";
var b=ture;
var c=22;
var u;
var n=null;
var 0=new function();
alert(typeof s);//string;
alert(typeof b);//boolean;
alert(typeof u);//undefined;
alert(typeof n);//object;
alert(typeof 0);//object;

确定是哪种引用类型时,用instanceof

alert(persons instanceif object);//变量person是object吗?
alert(colorss instanceif array);//变量colors是array吗?
alert(pattern instanceif RegExp);//变量pattern是RegExp吗?

函数的预处理(提升)

alert(a);
var a=123;//执行的结果是undefined;
程序相当于是: var a;
                   alert(a);
                   a=123;

函数的执行第一步要进行预处理,然后再一步步执行代码,看实例

<script type="text/javascript">
    alert(a);
    var a = 1;
    alert(a);
    function a(){alert(123);}
    alert(a);
    a();
</script>
第一步预编译
 var a;
  function a() {alert(123);}
第二步一步步执行代码:
     alert(a);//function a() {alert(123);}
     a=1;
    alert(a);//1
    alert(a)://1
    a();//报错,相当于1();

js没有按引用传参的功能,切忌,不能把传递引用参数当做按引用传参

function setName(obj){
          obj.name="dddd";
}
var person=new object();
setName(person);
alert(person,name);//ddd这里是按质传参的

同级函数的作用域不是嵌套的,不能访问

function f1(){
   var b=2;
   alert(b);
    f2();
}
function f2()
{
    var d=3;
    alert(d);
    alert(b);//不出现b
}

但是如果是这样的嵌套函数f2()嵌套在f1()作用域中,f1()作用域嵌套在全局作用域中,形成了作用域链;

function f1(){
   var b=2;
   alert(b);
    function f2()
  {
    var d=3;
    alert(d);
    alert(b);//2
  }
}

for语句和if语句没有封闭作用域的功能,都是全局的

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

1、执行环境有全局执行环境和函数执行环境之分;

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

3、函数的局部环境不仅有访问函数作用域中的变量,而且有权访问其包含(父类)环境、乃至全局环境;

4、全局环境智能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据;

5、变量的执行环境有助于确定如何释放内存;

javascript语言是一门具有自动垃圾收集机制的编程语言,开发人员不必关心内存分配和回收问题:可以对javascript的垃圾收例程作如下总结;

1、 离开作用域的值将自动标记为可以回收,因此将在垃圾收集期间被删除;

2、“标记清除”是目前流行的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然后再将其回收

3、解除变量的引用不仅有助于消除循环引用对象,而且对垃圾收集也有好处,为了确保有效地回收内存,应该及时解除不再使用的全局对象,全局对象属性以及循环引用变量的引用;

function  createPerson(name){
    var localPerson=new Object();
   localPerson.name=name;
   return localPerson;
}
var  dd=createPerson("dddd");
dd=null;//手工解除dd的引用

 

javascrip高级程序设计的学习笔记【作用域和执行环境】

标签:

原文地址:http://www.cnblogs.com/whyx/p/4440157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!