Naiteluo

home

high performance JavaScript notes 1

15 Aug 2012

Chapter 1 Loading and Execution 加载和执行

JavaScript的阻塞特性使js性能问题变的复杂。大多数浏览器使用单一进程来处理ui和执行脚本。代码的执行会阻塞浏览器的其他进程,例如用户界面绘制。

将script标签放到页面的底部,</body>之前。能确保脚本执行前页面已经加载完毕。

浏览器在解析到<body>前不会渲染页面

把内嵌脚本放在引用外链样式表的<link>标签后会导致页面阻塞去等待样式表的下载;是为了确保脚本执行时能获得最精准的样式信息;

合并脚本。页面中script标签越少,加载越快,响应更迅速。

使用无阻塞方式下载代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
		(function (window) {
		    if (window.loadScript) 
		        throw new Error('loadScript fails to be modefied.');
		        
		    window.loadScript = function (url, callback) {
		        var script = document.createElement('script');
		        script.type = 'text/javascript';
		
		        if (script.readyState) {    // IE
		            script.onreadystatechange = function () {
		                if (script.readyState == 'loaded' || script.readyState == 'complete') {
		                    script.onreadystatechange = null;
		                    callback();
		                }
		            };
		        } else {    // other browser
		            script.onload = function () {
		                callback();
		            };
		        }
		
		        script.src = url;
		        document.getElementsByTagName("head")[0].appendChild(script);
		    };
		
		} (window));
		
如:
	<script type="text/javascript" src="loader.js"></script>
	<script type="text/javascript">
	    loadScript("the-rest.js", function () {
	        app.init();
	    });
	</script>
	
一旦页面初始化的脚本加载完,就可以用loadScript函数去加载页面其他功能所需的脚本了。YUI3也使用类似的方法,引入一个种子文件,来加载丰富的功能组件:
	<script type="text/javascript" src="http://yui.yahooapis.com/combo?3.0.0/build/yui/yui-min.js"></script>
	<script type="text/javascript">
		YUI().use('dom', function (Y) {
		    Y.DOM.addClass(document.body, 'loaded');
		});
	</script>
	

Chapter 2 Data Access 数据访问

四种基本的数据存储位置

总的来说,直接量和局部变量的访问速度快于数组项和对象成员的访问速度。

作用域链与标志符解析

用hasOwnProperty()方法判断对象是否包含特定的实例成员,要确定对象是否包含特定的属性,可以使用in操作符。
1
2
3
4
5
6
7
8
9
10
11
	var book = {
	    title: "High Performance JavaScript",
	    publisher: "Yahoo! Press"
	};
	
	alert(book.hasOwnProperty("title"));    // true
	alert(book.hasOwnProperty("toString")); // false
	
	alert("title" in book);                 // true
	alert("toString" in book);              // true