JavaScript基础及前端优化

一.JavaScript基础

1.闭包

        简单来说,一个函数内部调用了函数外部的变量就是闭包。

        简单闭包:

var i = 1;
function fn (){
	alert(i);
}

        复杂闭包:

var cache = (function(){
	var obj = {};//避免暴露非必要变量
	
	return {
		get: function(key){
			return obj[key];
		},
		set: function(key, value){
			obj[key] = value;
		}
	};
})();

        闭包的优点是有利于保护私有变量,加强了封装性;不增加额外的全局变量。但它强耦合,常驻内存。

 

2.作用域

        表示变量或函数起作用的区域,指代了它们在什么样的上下文中执行,亦即上下文执行环境。Javascript的作用域只有两种:全局作用域和本地作用域,本地作用域是按照函数来区分的。

<script>
var i = 1;
function fn(){
	alert(i);// undefined

	var i = 2;
	alert(i);// 2
}
fn();
</script>
<script>
var i = 0;
while(i < 3) {
	i ++;
	setTimeout(function(){
		alert(i);
	}, 1);
}

// 弹出3次“3”
</script>

 

3.作用域链

        当代码在一个环境中执行时,会创建变量对象的一个作用域链来保证对执行环境有权访问的变量和函数的有序访问。

<script>
	!function() {
		var global = {
			name: 'global'
		};
		
		function globalFn() {
			var inner = {
				name : 'globalFn inner'
			};
			!function() {
				var foo = 'foo';
				
				console.log(foo);
				console.log(inner.name);
				console.log(global.name);
			}();
		}	
		
		globalFn();
	}();
</script>

运行结果:

foo
globalFn inner
global

 

4.类的定义

方式一:

function Foo() {
    this.a = 1;
    this.start = function(){
        // ...
    };
    this.end = function(){
        // ...
    };
}

方式二:

function Foo() {
    this.a = 1;
}
Foo.prototype.start = function(){
    // ...
};
Foo.prototype.end = function(){
    // ...
};

方式三:

function Foo() {
    this.a = 1;
}
Foo.prototype = {
    start: function(){
        // ...
    },
    end: function(){
        // ...
    }
};

方式四:

Function.prototype.method = function(name, fn){
    this.prototype[name] = fn;
};
function Foo() {
    this.a = 1;
}
Foo.method('start', function(){
    // ...
});
Foo.method('end', function(){
    // ...
});

方式五:

// 链式调用
Function.prototype.method = function(name, fn){
    this.prototype[name] = fn;
    return this;
};
function Foo() {
    this.a = 1;
}
Foo.method('start', function(){
    // ...
}).method('end', function(){
    // ...
});

 

二.前端优化

1.css优化

        CSS文件写在头部进行引用

        避免在文档内内联样式

        避免滥用web字体

        避免CSS表达式

        用<link>代替@import

        避免使用(IE)过滤器

2.javaScipt优化

        把脚本放到底部

        避免在文档内内联脚本

        最小化DOM访问

var i = $(input);
i.attr();
i.val();

        最小化全局对象访问

var a = window.a;
a.xx
a.xxx

 

3.image优化

        优化图片

        a.把gif转成png

        b.运行pngcrush或其它工具压缩png

        c.运行jpegtran或其它工具压缩jpeg

        优化CSS雪碧图

        a.缩小图片间的间距

        b.把颜色近似的图片合并到一张雪碧图

       不要在html中缩放图片

        favicon.ico小且缓存

 

4.请求优化

        Combined Files-合并文件

        CSS Sprites-雪碧图,将多张图片合并成一张图片

        Inline Images-內连图片

        压缩资源文件

5.服务器优化

        Gzip压缩资源文件

        a.Gzip通常可以减少70%的响应大小

        b.可压缩的有html、js、css、json等文本文件

        添加Expires或Cache-Control

        a.对静态组件:Expires

        b.对动态组件:Cache-Control

        配置Etags

        尽量使用GET Ajax请求

        如下所示百度主页的网络请求信息:


        Etag 是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等。具体内部含义是使服务器控制的,就像Cookie那样。

        HTTP协议规格说明定义ETag为“被请求变量的实体值” 。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端。

        常用cache-directive值

        对cache-directive值的浏览器响应

猜你喜欢

转载自bijian1013.iteye.com/blog/2265162