SlideShare a Scribd company logo
1 of 91
Javascript 技巧与优化
kim
问题1
• Javascript 对于你来说是?
• Javascript 是 PHP 程序员最头痛的事
问题2
• 为什么要把 Javascript 放在 </body> 之前?
• IE经典错误“operation aborted”
• 不阻塞页面解析
问题3
• Javascript 为什么这么令人崩溃?
• 严苛的浏览器环境
• 变态的兼容问题,各种不同的内核、引擎
• 单线程,阻塞也得靠浏览器
技巧
• If、switch、for 语句都用 {} 括起来
• js文件几个注意的地方:
1. 统一用 UTF-8 编码
2. 文件头和尾都写上 “;”
3. 所有注释使用 /**/
4. 文件头写上 document.domain = "56.com";
方便跨域使用
• typeof (null) == 'object' 是 true
• var a;
• a == undefined 是 true
• null == undefined 是 true
• null === undefined 则是 false
• 字符串连接优先级高于算术运算:
• 1 + '1' + 1 = '111’
• '2' - 1 - 1 = 0
• switch 语句很快
• 把发生几率最高的 case 放在前面
• HTML5 是个无底洞
• js 没有函数重载概念:
function foo(a) {
alert(1);
}
function foo(a, b) {
alert(2);
}
var f = foo(100); // alert 2
• var a = '1';
• var b = {n:'kim'};
• var c = a; // 值复制
• var d = b; // 引用复制
• 初始化对象尽量使用字面量语法:
var obj = {
"name": "kim",
"age": 18
};
• RegExp构造函数中的反斜杠需要双重转义:
// 比如匹配 2.5、3.4 等小数
var e = /d.d/;
var e = new RegExp("d.d");
• 递归函数的定义:
var factorial = (function f(num){
if (num <= 1) {
return 1;
} else {
return num * f(num - 1);
}
});
• 理解 this 对象: 当前的环境对象:
window.name = 'win';
var obj = {name: "kim"};
function myEnv()
{
alert(this.name);
}
myEnv.call(window); // win
myEnv.call(obj) // kim
• 取 a-b 中间的随机数公式:
• var rand = Math.floor(Math.random() * b + a);
• prototype:定义对象的祖宗。
• 如果不了解 prototype,那就别使用它,一
般工厂模式或者单例模式就够用了
• 标准单例定义模式:
var singleton = function() {
var private = 'hey';
function somePrivateFunc() {
return 'hi';
}
var public = {
“name”: “kim”,
getPrivate: function() {
alert(private + somePrivateFunc());
}
}
return public;
}();
var s = singleton;
s.getPrivate();
• 跨浏览器取得窗口左上角位置:
• var left = (window.screenLeft ?
window.screenLeft : window.screenX);
• var top = (window.screenTop ?
window.screenTop : window.screenY);
• url跳转的几种方式:
window.location = 'http://example.com/';
location.href = 'http://example.com/';
location.assign('http://example.com/');
// 用replace的区别是取代history中的记录
location.replace('http://example.com/');
• 用 location 页内跳转:
• // url变成 http://example.com/#hash1
location.hash = '#hash1';
• // url变成 http://example.com/user/#hash1
location.pathname = 'user';
• // url变成 http://www.56.com/user/#hash1
location.hostname = 'www.56.com';
• 除非是紧急bug,或者小范围的修改,否则不要用
浏览器检测,而应该用功能检测:
// 正确
if (document.all) {
// do something with document.all
}
// 错误
if (browser.isIE) {
// do something with document.all
} else {
// do nothing with document.all
}
• 获取 html 元素:
document.documentElement
document.firstChild
document.childNodes[0]
• 2个子域页面共享js对象:
• document.domain = “example.com”
• document.write 输出 script 需注意:
• document.write("<script
type="test/javascript" src="objcmt.js">" +
"</script>");
• 屏幕滚动到该元素:div.scrollIntoView();
• 站内js的兼容测试:必须按实际情况,根据
各浏览器的访问数据为依据
• 访问 iframe 中的 document:
• var iframe = document.getElementById('ifrm');
• var ifrmdoc = iframe.contentDocument
|| iframe.contentWindow.document;
• 谨记 DOM 事件流:
• 捕捉阶段:
• document -> html -> body -> ... -> div
• 冒泡阶段:
• div -> ... -> body -> html -> document
• setTimeout 高级定时器:
f = setTimeout(function () {
objcmt.ajaxFlvHeartbeat();
f = setTimeout(arguments.callee, 180000);
}, 180000);
• IE经典错误:
• “缺少标识符、字符串或数字”,一般就是多
了个逗号
• IE经典错误:
• “无效字符”,转义前面缺了引号,或者字符
串中的引号缺了转义
• 判断参数是否传入:
function foo(param1, param2)
{
if (param1) {
// bad
}
if (typeof param1 != 'undefined') {
// good, go on
}
if (param2 instanceof Function) {
// better, go on do with function
}
}
• instanceof, typeof 等等都不是100%正确的,
最实际的做法是直接判断该对象,或者该
方法是否可用,比如:
if (document.all) {
// do something with document.all
}
• 不要用各种 javascript 模板技术,从个人经
验来看,这些模板技术只会添乱
• 不要“添加、修改、重定义”已有实例或对象
的属性和方法
• 两者的区别?
• var obj1 = {"name": "kim"}
• var obj1 = {name: "kim"}
• JSONP 的原理:
function myCallback(rep) {
alert(rep);
}
var script = document.createElement('script');
script.src = "http://comment.56.com/api/api.php?callback=myCallback";
document.body.appendChild(script);
// api.php
<?php
if (isset($_GET['callback'])) {
echo htmlspecialchars($_GET['callback'] . '()');
}
exit();
?>
• 尽量少用框架,或者基于框架开发的组件
• 网站流量统计:嵌入js方式的统计,比服务
器日志更准确,因为客户端有缓存。
• 用 <object> 先缓存js,再执行:
<script type="text/javascript">
// 先cache js,再执行
var myJs = "http://example.com/myJs.js";
function cachejs(script_filename){
var cache = document.createElement('object');
cache.data = script_filename;
cache.width = 0;
cache.height = 0;
document.body.appendChild(cache);
}
function loadjs(script_filename) {
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', script_filename);
script.setAttribute('id', 'script_id');
script_id = document.getElementById('script_id');
if(script_id){
document.getElementsByTagName('head')[0].removeChild(script_id);
}
document.getElementsByTagName('head')[0].appendChild(script);
}
cachejs(myJs);
loadjs(myJs);
</script>
• 使用 jQuery 深度复制来重置对象,比如要
在其它地方获取一个纯净的 oriObj 对象:
var pureObj = jQuery.extend(true, {}, oriObj);
function someFunc() {
oriObj = jQuery.extend(true, {}, pureObj);
}
someFunc();
// deal with oriObj
• 减少js依赖的方法:
1. 尽量不依赖别的 js 文件,插件或者引用都可以直接加
到文件中,作为本地代码
2. 使用本地存储来解耦,比如 cookie
3. 尽量不使用全局变量和全局函数,如必要,可以通过
统一使用一个全局变量来实现,比如:
var myGlobal = {
GLOBAL_CONSTANTS: "coco",
"globalName": "kim",
"globalFunc": function() {
alert('haha');
}
}
• 函数节流:
// 睡一会儿
function sleep(milliSeconds){
var startTime = new Date().getTime();
while (new Date().getTime() < startTime + milliSeconds);
}
var throttle = function(fn, delay) {
// 定时阀
var timer = null;
// 返回创建的函数
return function() {
var that = this,
args = arguments;
clearTimeout(timer);
timer = setTimeout(function() {
fn.apply(that, args);
}, delay);
};
};
i = 0;
var myFunc = function() {
// 每1.5秒加一点内容
sleep(1500);
document.body.innerHTML += i + '<br />';
i++;
}
window.onresize = throttle(myFunc, 100);
性能
• 尽量使用原生 javascript 方法
• 用逗号一次定义多个变量:
var a = 1,
b = 'hi',
c = [1,3];
• 初始化数组或对象都可以只用一条语句:
var arr = new Array();
arr[0] = 1;
arr[1] = 2;
// 完全等同以下:
var arr = [1, 2];
var obj = new Object();
obj.name = 'kim';
obj.age = 3;
// 完全等同于一条字面量定义:
var obj = {
"name": 'kim',
"age": 3
};
• 乘除2的操作都可以用位运算代替,比如:
var i = 2 * 4;
// 等价于
var i = 2 << 2;
• 三元运算符 “?:” 更简洁更快:
var min = Math.min(a, b); // 慢
var min = a < b ? a : b; // 快
• 直接数组追加比push要快:
arr.push(v); // 慢
arr[arr.length] = v; // 快
• 字符串连接:
// 慢,创建了一个临时字符串
str += 'x' + 'y';
// 更快,更少内存
str += 'x';
str += 'y';
• 尽量不要用 for-in 来遍历对象。
• for-in 会为对象的所有可枚举的属性创建一
个 list,并且在进行枚举之前检查重复属性。
• 最快的数组循环:
var i = arr.length - 1;
if (i > -1) {
do {
// do something with arr[i]
} while (--i >= 0);
}
• 尽量不用 with 语句,容易出 bug。
• with 延长了作用域,js编译时识别不了这个
附加作用域的,通常都可以直接用
obj.property 来代替。
• new String 的应用场景,如果需要多次调用字符串对象的属性时:
// 共创建21个变量,每次调用都会创建一个临时字符串变量
var s = '0123456789';
for (var i = 0; i < s.length; i++) {
s.charAt(i);
}
// 只创建一个对象
var s = new String('0123456789');
for (var i = 0; i < s.length; i++) {
s.charAt(i);
}
• 闭包:延长了作用域而且常驻内存。
• 对象、对象中的对象、闭包,在不用的时候就
设为 null ,等待内存回收,特别是当对象是
Dom 元素的时候。
obj1.obj2 = new Foo();
obj1.dom3 = document.getElementById('id1');
// some operations ...
obj1.obj2 = null;
obj1.dom3 = null;
obj1 = null;
• 尽量不用全局变量和全局函数:
1. 全局变量实际上是2个作用域,一个是当
前 js 脚本,一个 windows 。
2. 在整个js运行周期内都占用内存,并不像
局部变量,用完就可以被回收
• 函数内使用全局变量,尽量把全局变量变成局
部变量,或者通过参数传入函数内部,以保证
最短作用域链。
var foo = 'foo';
function bar()
{
var local = foo,
dm = document;
alert(local);
dm.write(local);
dm.write(local);
}
• try-catch 是低性能的,切忌用在循环里,“变量e”是个额外开销
for (var i = 0; i < obj.length; i++) {
try {
test[obj[i]].property = somevalue;
} catch(e) {
...
}
}
应该写在外面:
try {
for (var i = 0; i < obj.length; i++) {
test[obj[i]].property = somevalue;
}
} catch(e) {
...
}
• 更好的实践是根本不用 try-catch ,基本上
大多数情况下都可以用 if 来代替。
• js 这种弱类型的语言,用 if 能解决很多问题。
• setTimeout 和 setInterval 应该直接传入
function :
setTimeout("alert('hihi')", 10); // 慢
setTimeout(function() {
alert(‘hihi’);
}, 10); // 快
• getElementById 是最快的,仸何时候都是开
发首选。
• 所有类型的 selector 都是可以用指定 id 来替
代的。
• 尽量不使用 HTMLCollection 对象。
• 比如 getElementByTagName、
getElementsByName、document.images、
document.forms、jQuery('div') 等。
• innerHTML 和 outerHTML 的特点:
1. 很快,但不是所有元素都支持。
2. 需手动清除 innerHTML 里面 js 对象和属
性绑定,优化内存
• 避免重复设置 innerHTML,比如:
// 错误
for (var i = 0; i < 10; i++) {
div.innerHTML += 'hi';
}
// 正确
var htmltext = '';
for (var i = 0; i < 10; i++) {
htmltext += 'hi';
}
div.innerHTML(htmltext);
• 仸何情况下,遍历节点都是性能杀手,应
坚决避免,比如:
document.createNodeIterator
• eval == evil // 不解释
• 和 css 解耦:
1. 尽可能少的修改元素 style 属性
2. 不在 css 中使用 expression
3. 尽量通过修改 className 来修改样式
4. 通过 cssText 属性来设置样式值
// 进行了4次重新渲染
el.style.color = 'red;
el.style.height = '100px';
el.style.fontSize = '12px';
el.style.backgroundColor = 'white';
• 尽量不在元素中直接绑定事件处理,事件
处理程序的本质:
<input onclick="alert(this)" />
1. 开辟内存,创建一个函数
2. 函数内部封装了对该对象的引用,即 this
对象
3. 创建了局部变量 event 事件对象
4. 每定义一个函数处理程序就是对DOM的
一次访问
• 解决 inline script 阻塞页面的方法,排名先后:
1. window.onload:并行下载,渲染无阻
2. setTimeout:并行下载,部分浏览器渲染无
阻
3. 移到底部:并行下载,但是渲染还是阻塞
4. defer:并行下载,部分浏览器支持
• 设置元素的 position 为 absolute 或 fixed,可
以使元素从 DOM 树结构中脱离出来独立的
存在。
• 在元素的 position 为 static 和 relative 时,元
素处于 DOM 树结构当中,当对元素的某个
操作需要重新渲染时,浏览器会渲染整个
页面。
• 页面重复渲染,即 reflow 和 repaint 发生的情景:
1. DOM 元素的添加、修改(内容)、删除(Reflow +
Repaint)
2. 应用新的样式,或者修改任何影响元素外观属性的时
候(Reflow + Repaint)
3. 仅修改 DOM 元素的字体颜色(Repaint)
4. Resize 浏览器窗口、滚动页面(Reflow)
5. 读取元素的部分属性(offsetLeft、offsetTop、
offsetHeight、offsetWidth、scrollTop/Left/Width/Height、
clientTop/Left/Width/Height、getComputedStyle()、
currentStyle(in IE))(是的,读取属性也会引起repaint!)
• Reflow:简单的说,就是位置、大小变了
• Repaint:简单地说,就是字体、颜色变了
• 减少 reflow/repaint :
// 将元素的 display 设为 "none",完成修改后
再把 display 改为原来的值
var dv = document.getElementById('divId');
dv.style.display = 'none';
dv.innerHTML += 'hi ';
dv.innerHTML += 'kim';
dv.style.color = 'red';
dv.style.display = 'block';
• 减少 reflow/repaint :
// 使用 DocumentFragment 一次性创建多个DOM节点
var span1 = document.createElement('span');
var span2 = document.createElement('span');
span1.appendChild(document.createTextNode("hi"));
span2.appendChild(document.createTextNode("kim"));
var fragment = document.createDocumentFragment();
fragment.appendChild(span1);
fragment.appendChild(span2);
var div = document.getElementById("divContainer");
div.appendChild(fragment);
• 层与渲染的关系:
// 创建了2层
var newWidth = aDiv.offsetWidth + 10; // Read
aDiv.style.width = newWidth + 'px'; // Write
var newHeight = aDiv.offsetHeight + 10; // Read,清空了 reflow 队
列,导致新增一层
aDiv.style.height = newHeight + 'px'; // Write
// 只建了1层
var newWidth = aDiv.offsetWidth + 10; // Read
var newHeight = aDiv.offsetHeight + 10; // Read
aDiv.style.width = newWidth + 'px'; // Write
aDiv.style.height = newHeight + 'px'; // Write
• Javascript 终极优化 - 事件代理和委托
1. 减少 DOM 加载时间
2. 减少内存使用
3. 响应最快
/* 举一个实际应用中的例子:评论删除、回复、顶 */
"initListBindings": function()
{
var that = this;
/* 代理 click 时间 */
jq('#' + config.cmtTarget).bind('click', function(event){
event.stopPropagation(); /* 停止冒泡 */
var target = jq(event.target); /* 获取正在访问的对象 */
switch (target.attr('class')) {
case 'cmt_delete_link': /* 如果点击的是删除链接 */
that.openDelCommentPopup(); /* 打开删除对话框 */
break;
case 'cmt_reply_link': /* 如果点击的是回复链接 */
that.openReplyPopup(); /* 打开回复框 */
break;
case 'cmt_agree_link_em': /* 如果点击的是顶 */
target = target.parent();
case 'cmt_agree_link': /* 如果点击的是顶链接 */
that.ajaxIncNbAgree(event.target, ids[1], ids[2]); /* 执行“顶”动作 */
event.preventDefault(); // IE6 getJSON bug hack
break;
default:
break;
}
});
},
实例吐槽
Javascript 优化无止境
Faq
谢谢!

More Related Content

What's hot

PHPUnit 入門介紹
PHPUnit 入門介紹PHPUnit 入門介紹
PHPUnit 入門介紹Jace Ju
 
Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)振揚 陳
 
Btrace intro(撒迦)
Btrace intro(撒迦)Btrace intro(撒迦)
Btrace intro(撒迦)ykdsg
 
编辑器设计U editor
编辑器设计U editor编辑器设计U editor
编辑器设计U editortaobao.com
 
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & WindowsChu-Siang Lai
 
RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試Wen-Tien Chang
 
Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Joseph Chiang
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascriptjay li
 
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式勇浩 赖
 
论 Python 与设计模式。
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。勇浩 赖
 
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享Chong-Kuan Chen
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)Kris Mok
 
現代 IT 人一定要知道的 Ansible 自動化組態技巧
現代 IT 人一定要知道的 Ansible 自動化組態技巧現代 IT 人一定要知道的 Ansible 自動化組態技巧
現代 IT 人一定要知道的 Ansible 自動化組態技巧Chu-Siang Lai
 
JavaScript Advanced Skill
JavaScript Advanced SkillJavaScript Advanced Skill
JavaScript Advanced Skillfirestoke
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型keelii
 

What's hot (20)

Node way
Node wayNode way
Node way
 
PHPUnit 入門介紹
PHPUnit 入門介紹PHPUnit 入門介紹
PHPUnit 入門介紹
 
Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)
 
RSpec & TDD Tutorial
RSpec & TDD TutorialRSpec & TDD Tutorial
RSpec & TDD Tutorial
 
Btrace intro(撒迦)
Btrace intro(撒迦)Btrace intro(撒迦)
Btrace intro(撒迦)
 
Berserk js
Berserk jsBerserk js
Berserk js
 
编辑器设计U editor
编辑器设计U editor编辑器设计U editor
编辑器设计U editor
 
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
 
RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試
 
Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
 
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式
 
论 Python 与设计模式。
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。
 
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)
 
現代 IT 人一定要知道的 Ansible 自動化組態技巧
現代 IT 人一定要知道的 Ansible 自動化組態技巧現代 IT 人一定要知道的 Ansible 自動化組態技巧
現代 IT 人一定要知道的 Ansible 自動化組態技巧
 
ev2oik
ev2oikev2oik
ev2oik
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
JavaScript Advanced Skill
JavaScript Advanced SkillJavaScript Advanced Skill
JavaScript Advanced Skill
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
 

Viewers also liked

Arts Building.8 18 09
Arts Building.8 18 09Arts Building.8 18 09
Arts Building.8 18 09jeffreyestes
 
SKFs tillverkningsenheter 31 december 2008
SKFs tillverkningsenheter 31 december 2008SKFs tillverkningsenheter 31 december 2008
SKFs tillverkningsenheter 31 december 2008SKF
 
ASMSA FIRM Paper Guide
ASMSA FIRM Paper GuideASMSA FIRM Paper Guide
ASMSA FIRM Paper GuideDaniel Moix
 
Testing OSGi-based Applications with DA-Testing
Testing OSGi-based Applications with DA-TestingTesting OSGi-based Applications with DA-Testing
Testing OSGi-based Applications with DA-TestingValery Abu-Eid
 
Eekels Company Profile (English)
Eekels Company Profile (English)Eekels Company Profile (English)
Eekels Company Profile (English)Leenart
 
Cordoba 107 bahia de rosas algarrobo
Cordoba 107 bahia de rosas algarroboCordoba 107 bahia de rosas algarrobo
Cordoba 107 bahia de rosas algarrobofranciscoalvarezh
 
Nellie Chowbay Summer 2009 Newsletter
Nellie Chowbay Summer 2009 NewsletterNellie Chowbay Summer 2009 Newsletter
Nellie Chowbay Summer 2009 Newsletternchowbay
 
Q1 2009 eng
Q1 2009 engQ1 2009 eng
Q1 2009 engSKF
 
Carnival Imagination
Carnival ImaginationCarnival Imagination
Carnival Imaginationdilris
 
Group Presentation
Group PresentationGroup Presentation
Group PresentationUCSC
 
Penyediaan bekas
Penyediaan bekasPenyediaan bekas
Penyediaan bekasieka_whizz
 
Lua 30+ Programming Skills and 20+ Optimization Tips
Lua 30+ Programming Skills and 20+ Optimization TipsLua 30+ Programming Skills and 20+ Optimization Tips
Lua 30+ Programming Skills and 20+ Optimization TipsHo Kim
 
BasicWord03
BasicWord03BasicWord03
BasicWord03adisg
 
Evolution of online interactions while observing classroom situations on vide...
Evolution of online interactions while observing classroom situations on vide...Evolution of online interactions while observing classroom situations on vide...
Evolution of online interactions while observing classroom situations on vide...Université de Sherbrooke
 

Viewers also liked (20)

Arts Building.8 18 09
Arts Building.8 18 09Arts Building.8 18 09
Arts Building.8 18 09
 
SKFs tillverkningsenheter 31 december 2008
SKFs tillverkningsenheter 31 december 2008SKFs tillverkningsenheter 31 december 2008
SKFs tillverkningsenheter 31 december 2008
 
ASMSA FIRM Paper Guide
ASMSA FIRM Paper GuideASMSA FIRM Paper Guide
ASMSA FIRM Paper Guide
 
Actividad V
Actividad VActividad V
Actividad V
 
Testing OSGi-based Applications with DA-Testing
Testing OSGi-based Applications with DA-TestingTesting OSGi-based Applications with DA-Testing
Testing OSGi-based Applications with DA-Testing
 
Eekels Company Profile (English)
Eekels Company Profile (English)Eekels Company Profile (English)
Eekels Company Profile (English)
 
Cordoba 107 bahia de rosas algarrobo
Cordoba 107 bahia de rosas algarroboCordoba 107 bahia de rosas algarrobo
Cordoba 107 bahia de rosas algarrobo
 
Nellie Chowbay Summer 2009 Newsletter
Nellie Chowbay Summer 2009 NewsletterNellie Chowbay Summer 2009 Newsletter
Nellie Chowbay Summer 2009 Newsletter
 
Q1 2009 eng
Q1 2009 engQ1 2009 eng
Q1 2009 eng
 
Carnival Imagination
Carnival ImaginationCarnival Imagination
Carnival Imagination
 
Group Presentation
Group PresentationGroup Presentation
Group Presentation
 
The Myst Story
The Myst StoryThe Myst Story
The Myst Story
 
WWI Comes To An End
WWI Comes To An EndWWI Comes To An End
WWI Comes To An End
 
Tli 2009
Tli 2009Tli 2009
Tli 2009
 
Projects
ProjectsProjects
Projects
 
New Deal
New DealNew Deal
New Deal
 
Penyediaan bekas
Penyediaan bekasPenyediaan bekas
Penyediaan bekas
 
Lua 30+ Programming Skills and 20+ Optimization Tips
Lua 30+ Programming Skills and 20+ Optimization TipsLua 30+ Programming Skills and 20+ Optimization Tips
Lua 30+ Programming Skills and 20+ Optimization Tips
 
BasicWord03
BasicWord03BasicWord03
BasicWord03
 
Evolution of online interactions while observing classroom situations on vide...
Evolution of online interactions while observing classroom situations on vide...Evolution of online interactions while observing classroom situations on vide...
Evolution of online interactions while observing classroom situations on vide...
 

Similar to JavaScript 80+ Programming and Optimization Skills

第三方内容开发最佳实践
第三方内容开发最佳实践第三方内容开发最佳实践
第三方内容开发最佳实践taobao.com
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdfczzz1
 
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsHo Kim
 
Introduction to Parse JavaScript SDK
Introduction to Parse JavaScript SDKIntroduction to Parse JavaScript SDK
Introduction to Parse JavaScript SDK維佋 唐
 
钟志 第八期Web标准化交流会
钟志 第八期Web标准化交流会钟志 第八期Web标准化交流会
钟志 第八期Web标准化交流会Zhi Zhong
 
KISSY for starter
KISSY for starterKISSY for starter
KISSY for starteryiming he
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanupted-xu
 
Web设计 3 java_script初探(程序员与设计师的双重眼光)
Web设计 3 java_script初探(程序员与设计师的双重眼光)Web设计 3 java_script初探(程序员与设计师的双重眼光)
Web设计 3 java_script初探(程序员与设计师的双重眼光)ziggear
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)Max Lai
 
【第一季第四期】JavaScript Optimization
【第一季第四期】JavaScript Optimization【第一季第四期】JavaScript Optimization
【第一季第四期】JavaScript Optimizationtbosstraining
 
OpenWebSchool - 01 - WWW Intro
OpenWebSchool - 01 - WWW IntroOpenWebSchool - 01 - WWW Intro
OpenWebSchool - 01 - WWW IntroHung-yu Lin
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJustin Lin
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送yongboy
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送yongboy
 

Similar to JavaScript 80+ Programming and Optimization Skills (20)

第三方内容开发最佳实践
第三方内容开发最佳实践第三方内容开发最佳实践
第三方内容开发最佳实践
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdf
 
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming Skills
 
Introduction to Parse JavaScript SDK
Introduction to Parse JavaScript SDKIntroduction to Parse JavaScript SDK
Introduction to Parse JavaScript SDK
 
钟志 第八期Web标准化交流会
钟志 第八期Web标准化交流会钟志 第八期Web标准化交流会
钟志 第八期Web标准化交流会
 
KISSY for starter
KISSY for starterKISSY for starter
KISSY for starter
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
 
Web设计 3 java_script初探(程序员与设计师的双重眼光)
Web设计 3 java_script初探(程序员与设计师的双重眼光)Web设计 3 java_script初探(程序员与设计师的双重眼光)
Web设计 3 java_script初探(程序员与设计师的双重眼光)
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)
 
前端测试
前端测试前端测试
前端测试
 
前端测试
前端测试前端测试
前端测试
 
【第一季第四期】JavaScript Optimization
【第一季第四期】JavaScript Optimization【第一季第四期】JavaScript Optimization
【第一季第四期】JavaScript Optimization
 
Html5
Html5Html5
Html5
 
OpenWebSchool - 01 - WWW Intro
OpenWebSchool - 01 - WWW IntroOpenWebSchool - 01 - WWW Intro
OpenWebSchool - 01 - WWW Intro
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
 
Win dbg入门
Win dbg入门Win dbg入门
Win dbg入门
 
Windbg入门
Windbg入门Windbg入门
Windbg入门
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送
 

More from Ho Kim

解决Lvs上行丢包的过程和收获
解决Lvs上行丢包的过程和收获解决Lvs上行丢包的过程和收获
解决Lvs上行丢包的过程和收获Ho Kim
 
40 Powerful Shortcuts of Xcode 6.x
40 Powerful Shortcuts of Xcode 6.x40 Powerful Shortcuts of Xcode 6.x
40 Powerful Shortcuts of Xcode 6.xHo Kim
 
Project Management Using Redmine
Project Management Using RedmineProject Management Using Redmine
Project Management Using RedmineHo Kim
 
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tipsOpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tipsHo Kim
 
Web Caching Architecture and Design
Web Caching Architecture and DesignWeb Caching Architecture and Design
Web Caching Architecture and DesignHo Kim
 
人人-56 账号拆分项目总结
人人-56 账号拆分项目总结人人-56 账号拆分项目总结
人人-56 账号拆分项目总结Ho Kim
 
OpenResty/Lua Practical Experience
OpenResty/Lua Practical ExperienceOpenResty/Lua Practical Experience
OpenResty/Lua Practical ExperienceHo Kim
 
Character Encoding and Database Transcoding Project
Character Encoding and Database Transcoding ProjectCharacter Encoding and Database Transcoding Project
Character Encoding and Database Transcoding ProjectHo Kim
 
Video Upload Architecture of 56.com
Video Upload Architecture of 56.comVideo Upload Architecture of 56.com
Video Upload Architecture of 56.comHo Kim
 
PHP Optimization for Millions Visits Level
PHP Optimization for Millions Visits LevelPHP Optimization for Millions Visits Level
PHP Optimization for Millions Visits LevelHo Kim
 
Comment System of 56.com
Comment System of 56.comComment System of 56.com
Comment System of 56.comHo Kim
 
Git Essence Tutorial
Git Essence TutorialGit Essence Tutorial
Git Essence TutorialHo Kim
 
MongoDB Basics and Tutorial
MongoDB Basics and TutorialMongoDB Basics and Tutorial
MongoDB Basics and TutorialHo Kim
 

More from Ho Kim (13)

解决Lvs上行丢包的过程和收获
解决Lvs上行丢包的过程和收获解决Lvs上行丢包的过程和收获
解决Lvs上行丢包的过程和收获
 
40 Powerful Shortcuts of Xcode 6.x
40 Powerful Shortcuts of Xcode 6.x40 Powerful Shortcuts of Xcode 6.x
40 Powerful Shortcuts of Xcode 6.x
 
Project Management Using Redmine
Project Management Using RedmineProject Management Using Redmine
Project Management Using Redmine
 
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tipsOpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
 
Web Caching Architecture and Design
Web Caching Architecture and DesignWeb Caching Architecture and Design
Web Caching Architecture and Design
 
人人-56 账号拆分项目总结
人人-56 账号拆分项目总结人人-56 账号拆分项目总结
人人-56 账号拆分项目总结
 
OpenResty/Lua Practical Experience
OpenResty/Lua Practical ExperienceOpenResty/Lua Practical Experience
OpenResty/Lua Practical Experience
 
Character Encoding and Database Transcoding Project
Character Encoding and Database Transcoding ProjectCharacter Encoding and Database Transcoding Project
Character Encoding and Database Transcoding Project
 
Video Upload Architecture of 56.com
Video Upload Architecture of 56.comVideo Upload Architecture of 56.com
Video Upload Architecture of 56.com
 
PHP Optimization for Millions Visits Level
PHP Optimization for Millions Visits LevelPHP Optimization for Millions Visits Level
PHP Optimization for Millions Visits Level
 
Comment System of 56.com
Comment System of 56.comComment System of 56.com
Comment System of 56.com
 
Git Essence Tutorial
Git Essence TutorialGit Essence Tutorial
Git Essence Tutorial
 
MongoDB Basics and Tutorial
MongoDB Basics and TutorialMongoDB Basics and Tutorial
MongoDB Basics and Tutorial
 

JavaScript 80+ Programming and Optimization Skills