有关您的 javascript 函数编译(上)
懒编译您 javascript
marja 的 parsing javascript better lazy than eager
解析什么是解析
- 解析 javascript code 为 AST 和 Scope 作用域
今天我们之关心这部分内容 - 生成字节码, 这个字节码用于解释器
- 优化编译为机器码在 电脑上执行
我们通常认为 javascript 是一门解释性还是编译的语言呢
sum(1,2)function sum(a,b){ return a + b;}
function foo(){ let a = 0; if(a == 0){ let b = "bar"; return a; }}
从上面代码运行没有问题来看 javascript 应该属于编译语言。
准备用 mac 的 keynote 画树形结构图,感觉连线有点吃力放弃了。
- 第一层是 foo 函数对应节点 FunctionIterial
let a = 0;
- 当我们 公告创立一个变量同时就生成一个变量的代理商。 而后就是我们的赋值语句。分别是变量代理商和
if(a == 0){ let b = "bar"; return a;}
- 看一下我们的 条件语句
由于没有 else 只有 if 所以就走 then。
作用域分析
# 为什么我们需要关注解析
由于我们parsing
不同的浏览器对lazy定义也不同,因为 javascript 本身并没有 spec 来定义lazy。
#### V8 有两种有两种解析模式
- eager parser 进行完全的解析, 构建 AST、 构建作用域, 检查语法错误。
- lazy preParser 构建 scope(作用域)而不构建 AST,
lazy 和 eager
let a = 0;//IIFE (immediately invoked function express)(function() eager() { // stuff })();function lazy(){ //stuff }lazy();
- 通过()()包裹函数是立即执行函数
- 即便 lazy 在最顶层被定义,lazy 也是 懒函数,只有在调用才会执行。
!function eager2(){ // stuff },function eager3(){ // stuff }
在函数前面增加 ! 表示这个函数是立即执行函数, 后面通过逗号间隔的也同样是立即执行函数。
也有少量特殊的情况
let f1 = function lazy() { // stuff }let f2 = function lazy(){ // stuff }()
f1 变量接受 lazy 函数作为值,作为懒函数来解决
f2 接受这个函数执行的结果作为 f2,首先我们看 lazy 应该是懒函数,但是他被立即执行了。
那么 懒函数跟我们有关系吗?
由于不是所有加载 javascript 都会被执行的,所以我们需要赖 加载来提高效率。
- 假如一个 eager 立即编译函数 没有被 调用, 这就是一种白费。
- 假如 一个懒函数被 执行了,当然也是一种资源的白费,由于我们将这个函数编译了两次,第一次 编译可能需要 0.5 ,第二次又进行 了编译,所以一共 1.5 时间。
强制 函数为立即编译模式
(function a(){})
Optimize.js 将那些将会在引用中(上面的情况) 进行包裹让他变成立即编译函数
ctxt 分配,赖函数我们需要分配 ctxt
let f = (function outer(){ let a = 20; function inner(){ return 1 } return inner;})();console.log(f());
我们看一看上面的代码的 f 接收一个立即 编译函数的返回值,返回值是一个懒函数,
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 有关您的 javascript 函数编译(上)
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 有关您的 javascript 函数编译(上)