javascript engine

50
JavaScript Engine 2011-04-19

Upload: jay-li

Post on 28-Jan-2015

127 views

Category:

Technology


5 download

DESCRIPTION

js引擎

TRANSCRIPT

Page 1: JavaScript Engine

JavaScript Engine

2011-04-19

Page 2: JavaScript Engine

• 拔赤淘宝前端开发工程师

http://jayli.github.com

Page 3: JavaScript Engine

JavaScript引擎

Page 4: JavaScript Engine

V8

Carakan

JaegerMonkey

Nitro

JScript

Page 5: JavaScript Engine

编译(compiled)解释(interpreted)

从源码到可执行代码

Page 6: JavaScript Engine

编译

(function foo(){alert(‘helloworld’);

})();

01001011101101…

Runtime.exec(‘helloworld.exe’)

source.js(源码)

helloworld.exe(二进制码)

运行时环境

编译

运行

Page 7: JavaScript Engine

解释

(function foo(){alert(‘helloworld’);

})();

Runtime.exec(‘中间机器码’)

source.js(源码)

helloworld.exe(二进制码)

解释器执行伪代码

编译&运行

运行时环境

Page 8: JavaScript Engine

解释

(function foo(){alert(‘helloworld’);

})();

Runtime.exec(‘中间机器码’)

JavaScript引擎编译&运行

运行时环境(浏览器)

Page 9: JavaScript Engine

JavaScript 是解释型语言

Page 10: JavaScript Engine

JavaScript代码执行的过程

词法分析

语法分析

预编译

语法检查

运行

运行时

Page 11: JavaScript Engine

执行”0=1=2”

在语法检查阶段报错这是一个语法错误程序没有开始运行

Page 12: JavaScript Engine

执行”a=b=c”

通过了语法检查在运行时报错程序已经开始运行

Page 13: JavaScript Engine

词法分析

语法分析

预编译

语法检查

运行

运行时

1,将上下文中var申明的变量放入”栈”中

并赋值为undefined

2,读入”定义”的函数

Page 14: JavaScript Engine

alert(a); //会报错吗?

var a = 1;

Page 15: JavaScript Engine

alert(a);var a = 1;

扫描整段代码,将a放入当前上下文的栈中,赋值为undefined

在栈中找到a并得到值undefined弹出”undefined”

将a赋值为1

局部变量的预编译

Page 16: JavaScript Engine

a();function a(){alert(‘Tom’);

}var a = function(){alert(‘Jim’);

};a();

2,预编译读入a的定义

1,变量a入栈

函数的预编译

Page 17: JavaScript Engine

a();function a(){alert(‘Tom’);

}var a = function(){alert(‘Jim’);

};a();

执行a(),弹出Tom

a被重新赋值

执行a(),弹出Jim

编译后的运行

Page 18: JavaScript Engine

function a(){//预编译定义,运行时略过

alert(‘helloworld’);}var a = function(){//预编译声明,运行时赋值

alert(‘helloworld’);};a = function(){//运行时变量赋值

alert(‘helloworld’);};

Page 19: JavaScript Engine

下面代码的运行结果?

Page 20: JavaScript Engine

a();function a(){

alert(1);}a();function a(){

alert(2);}a();var a = function(){

alert(3);};a();

Page 21: JavaScript Engine

常见问题

Page 22: JavaScript Engine

//a未声明时报错,不推荐

alert(a === undefined);

//推荐alert(typeof a === ‘undefined’);

判断变量存在

Page 23: JavaScript Engine

function(){alert(a); //显示undefined,不报错

if(false){var a = 1; //不会执行到,亦被声明

}}()

函数执行前,函数内部变量均被声明

Page 24: JavaScript Engine

Js执行和浏览器渲染

Page 25: JavaScript Engine

<!DOCTYPE HTML><html lang="zh"><head>head</head>

<body><div id=“J”>

<script>$.write(‘helloworld’);</script>

</div>…</body></html>

渲染出Script�节点

document

head

body

div#J

script

浏览器暂停渲染HTML将script交由js引擎编译执行

Page 26: JavaScript Engine

<!DOCTYPE HTML><html lang="zh"><head>head</head>

<body><div id=“J”>

<script>$.write(‘helloworld’);</script>

</div>…</body></html>

Js引擎执行代码段结束将渲染主动权交给浏览器继续渲染HTML

document

head

body

div#J

script

textNodeJs引擎创建了

textNode

Page 27: JavaScript Engine

阻塞:

Js的执行会中断HTML的渲染

Page 28: JavaScript Engine

Single UI Rendering Thread

Page 29: JavaScript Engine

TimeUI Rendering Thread

DOM

1,构建出DOM

2,UI update

Page 30: JavaScript Engine

TimeUI Rendering Thread

RenderUI

DOM

渲染出此时的Dom

Page 31: JavaScript Engine

TimeUI Rendering Thread

RenderUI exec JS

DOM

3,JS脚本新增了DOM节点

Page 32: JavaScript Engine

TimeUI Rendering Thread

RenderUI exec JS RenderUI

DOM

4,UI update

Page 33: JavaScript Engine

TimeUI Rendering Thread

RenderUI exec JS RenderUI

DOM

4,UI update

UI Update

• Repaint• Reflow

Page 34: JavaScript Engine

Repaint:• 透明度更改• 文字颜色变化• 背景颜色变化• 背景图片替换

Page 35: JavaScript Engine

Reflow:• 页面渲染过程中• Dom结构变化• 浏览器窗口大小改变• 布局变化

Page 36: JavaScript Engine

<div id=“J”><script>$(‘J’).css(‘color’,’red’);</script>

</div> Repaint

Page 37: JavaScript Engine

<div id=“J”><script>$(‘J’).append(‘<div>txt</div>’);</script>

</div> Reflow

Page 38: JavaScript Engine

减少Reflow/paint:性能攸关的大事!

Page 39: JavaScript Engine

<div id=“J”><script>for(i=0;i<100;i++)

$(‘J’).append(‘<div>’+i+’</div>’);</script>

</div> Reflow * 100 !

Page 40: JavaScript Engine

TimeUI Rendering Thread

RenderUI Run js for long time RenderUI

DOM

UI updateUI 没有反应…

Page 41: JavaScript Engine

<div id=“J”><script>for(i=0,str=‘’;i<100;i++){

str+=‘<div>’+i+’</div>’;}$(‘J’).append(str);</script>

</div> Reflow * 1 !

Page 42: JavaScript Engine

避免阻塞:同样性能攸关的大事

(异步执行JavaScript)

Page 43: JavaScript Engine

…<div id=“J”><script>setTimeout(function(){

$.write(‘helloworld’);},100);</script>

</div><div>doc</div></body></html>

Js引擎只启动了定时器,没有”write”操作浏览器可以很快获得DOM渲染权,继续渲染HTML

body

div#J

script

Js引擎开启了定时器

Page 44: JavaScript Engine

…<div id=“J”><script>setTimeout(function(){

$.write(‘helloworld’);},100);</script>

</div><div>doc</div></body></html>

body

div#J

script

浏览器继续渲染html

div

Page 45: JavaScript Engine

…<div id=“J”><script>setTimeout(function(){

$.write(‘helloworld’);},100);</script>

</div><div>doc</div></body></html>

body

div#J

script

定时器到时,插入domdiv

textNode

100ms

从定时器开启,到write节点完成中间的HTML渲染没有中断

Page 46: JavaScript Engine

…<div id=“J”><script>setTimeout(function(){

while(true){$.write(‘helloworld’);

}},100);</script>

</div>…

异步也不是万能的

Js中低效的Dom操作依然会阻断浏览器的渲染,让浏览器看起来像“冷冻”住

body

div#J

script

div

textNode

100ms

Page 47: JavaScript Engine

异步加载JS 减少阻塞

Js不要频繁读写Dom 减少reflow/paint

Page 48: JavaScript Engine

了解她

喜欢她

离不开她

Lovely JavaScript Engine !

Page 50: JavaScript Engine