JavaScript作用域和执行环境

来源:互联网 发布:免费cad2014软件下载 编辑:程序博客网 时间:2024/06/03 13:15


(1)首选要强调的一点是,JavaScript没有块级作用域

  function fun(){    num = 10;    alert('fun-num:'+num);  //10  }    alert('global-num:'+num); //10

我们在函数fun中声明了一个变量num,但是没有通过关键字var修饰,所有JavaScript默认将它作为一个全局的对象,这也是我们经常听到的

JavaScript的变量提升的概念。


(2)JavaScript中有个执行环境的概念,它定义了变量或函数有权访问的其他数据。每个执行环境都有一个关联对象,环境中所定义的对象和函数

都存在这个对象中,我们虽然不能直接获取这个对象,但解析器在后台会使用这个对象。

并且,在JavaScript中执行环境只有两种,一种是全局的执行环境,另一种是函数的执行环境。

说到代码的执行环境就不得不提对象的作用域链,先举个例子:

  var num = 10;  function fun(){    alert('num='+num);    }  fun(); //num=10

上述代码很简单,在调用fun()方法时,首先进入的是fun()这个函数的执行环境,JavaScript引擎把这个执行环境推到环境栈中,

代码开始执行,当用到num这个变量时,活动对象首先在自己的作用域中查找是否有这个对象,没有的话,就接着向上查找,最后在全局预中

找到这个对象,并使用它。而这个过程中,经历的所有的作用域形成了一个链,即作用域链。

作用域链的起始端始终是当前的执行环境,结尾段始终是全局环境,如果都没有找到,则汇报undefined。。。


注意:

当遇到with语句和try-catch语句时,作用域链会得到延长


(3)JavaScript垃圾回收

JavaScript拥有自动回收垃圾的机制,所以一般我们不需要手动维护对象的释放。

常用的垃圾回收策略有,标记清除和引用计数。

0 0