(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拥有自动回收垃圾的机制,所以一般我们不需要手动维护对象的释放。
常用的垃圾回收策略有,标记清除和引用计数。