1. 变量作用域
一个变量的作用域是指程序源代码中定义这个变量的区域 ,换句话说,变量只存在属于它的作用域里,(代码执行)离开了它的作用域,变量将被销毁(变量不能被访问)
2. 代码执行单元
只有一个代码执行单元的所有代码都翻译完成后,才会形成一棵语法树,并解释执行。
一个函数、一个JS文件以及script标签中的代码都属于一个独立的代码执行单元。
3. 变量声明提前
众所周知,Javascript是一种脚本语言,Javascript的执行过程也就是翻译执行的过程,每次翻译执行的单元为包含在”的src属性方式引入)。
Javascript函数里声明的所有变量(函数也是一种变量)都被提前至函数体的顶部,即Javascript引擎执行每一个Javascript代码单元之前,都会首先处理var关键字和function定义式,并把它们提前至函数体的顶部,但请注意,只是声明,不是赋值,所以从源代码的角度看,变量在声明之前就可以使用。
一般来说,声明只是用程序表明变量的类型和名字,而赋值则是为变量分配存储空间,并指定初始值。
4. 全局变量与window
在每个Javascript代码单元都可以引用的变量称之为全局变量,这些全局变量都是window的属性。
在window的初始化过程中,Javascript代码单元会从上到下依次执行,就好像存在一个虚拟的window主函数,这个主函数会依次执行每个Javascript代码单元。从这个角度理解,Javascript的全局变量就是在window对象的主函数里声明的变量。
5. 全局变量与Object
与Java一样,Object是所有Javascript对象的父类(原始对象除外,如(1 instanceof Object)==false),但Object与全局变量根本没什么关系,如果非要说有的话,那么Object也是全局变量,或者说全局变量的类型是Object。
现在网上有很多言论认为,Object.prototype也处于变量作用域链中,这其实是完全错误的,Object.prototype中的属性只用于对象属性的搜索,这完全是面向对象思想中的继承方法的体现。
6. 变量作用域链
Javascript只支持函数变量作用域,那么变量作用域链也必定是函数作用域链,即当定义一个函数时,就自动为此函数保存了一个函数作用域链,如果此函数定义在window的主函数里,那么它的函数作用域链上只有一个对象,即window的主函数作用域,反之,它的函数作用域链的对象依次为它的外部函数的函数作用域、它的外部函数的外部函数的函数作用域、……,直到window的主函数作用域。