今天有幸获得腾讯的电话面试,不幸的是面试非常惨,但是从中认识到自己的不足和找到日后该努力的方向,就拿面试中的关于js的预编译来说吧,小编都不知道是啥,面试完后赶紧查资料,写总结。
首先javascript是解释型语言,自然就是编译一行,执行一行。js运行过程分为三步:1、语法分析 2、预编译 3、解释执行
语法分析就是指js引擎去判断检查你的代码是否存在语法错误,解释执行更不用多说,自然就是执行你的代码,然而重中之重的是预编译,预编译简单理解就是在内存中开辟一些空间,存放一些变量与函数 ,那么到底预编译是在什么时候开始发生的呢?接下来就是本章的重点所在了。
理解预编译首先要明白函数声明和变量赋值:
function a(){ }//函数声明
这种形式的写法是函数声明,即声明一个函数,脚本在执行之前会做预编译处理。 co
var a= function(){ }//变量赋值
这种写法是变量赋值,函数在js语言里也是一种数据,匿名函数作为变量赋值给定义的变量。这种形式在预编译处理阶段,只会给变量a分配一个内存空间,不会做初始化。初始化过程中会在执行时执行。
总结:
预编译(函数执行前)
1. 创建AO对象(Active Object)
2. 查找函数形参及函数内变量声明,形参名及变量名作为AO对象的属性,值为undefined
3. 实参形参相统一,实参值赋给形参
4. 查找函数声明,函数名作为AO对象的属性,值为函数引用
预编译(脚本代码块script执行前)
1. 查找全局变量声明(包括隐式全局变量声明,省略var声明),变量名作全局对象的属性,值为undefined
3. 查找函数声明,函数名作为全局对象的属性,值为函数引用
预编译阶段发生变量声明和函数声明,没有初始化行为(赋值),匿名函数不参与预编译 ,只有在解释执行阶段才会进行变量初始化 。