《JavaScript模式》--第二章:基本技巧

/*
	基本技巧
		
	编写可维护性的代码
		阅读性好
		具有一致性
		预见性好
		看起来如同一个人编写
		有文档

	尽量少用全局变量
		JS使用函数管理作用域

*/

/*
	隐式地全局变量创建
*/
(function someFun() {
	var a = b = 0;
})();
console.log(window.b);
//输出:
//0
//分析:
//var a = b = 0与语句var a = (b = 0)相同,此时隐式创建了全局变量b

/*
	变量释放时的副作用
		使用var创建的全局变量不能删除
		不适用var创建的隐含全局变量可以删除
*/
var global_property_1 = "some value";
global_propery_2 = "some other value";
(function() {
	global_propery_3 = "another value";
})();
delete global_property_1
delete global_property_2
delete global_property_3
console.log(typeof global_property_1, typeof global_property_2, typeof global_property_3);
//输出:
// string undefined undefined 

/*
	访问全局对象
		若需要在内嵌函数作用域访问
	(function() {
		return this;
	})();
*/
(function() {
	console.log((function() {
		return this;
	})());
})();
// 输出:
// Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}

/*
	单一var模式
		只使用一个var在函数顶部进行变量声明
			提供一个单一的地址已查找到函数需要的所有局部变量
			防止出现变量在定以前就被使用的逻辑错误
			帮助牢记要声明变来那个,以尽可能少地使用全局变量
			更少的代码
*/

function someFun() {
	var a = 1,
		b = "2",
		sum,
		obj = {},
		someOther;
}

/*
	提升:零散变量的问题
		无论在哪里声明,效果都等同于在函数顶部进行声明,也就是所谓的提升
		为了避免提升造成的混乱,最好在最开始就声明要用的所有变量

	for循环
		暂存数据长度,否则每次循环迭代都要访问数据长度,会降低性能
*/
/*普遍模式*/
var myArray = [1, "a", "b", {}];
for (var i = 0, max = myArray.length; i < max; i++) {
	console.log(myArray[i]);
}
/*修改后的模式,仅仅使用一个临时变量*/
for (var i = myArray.length; i--;) {
	console.log(myArray[i]);
}

/*
	for-in循环
		应该用来遍历非数组对象
		会遍历原型链上的属性,使用hasOwnProperty()方法
*/
var myArray = [1, "a", "b", {}];
for (var item in myArray) {
	console.log(item);
}
// 输出:
// 0
// 1
// 2
// 3

/*标准的for-in写法*/
var myObj = {};
for (var i in myObj) {
	if (Object.prototype.hasOwnProperty.call(myObj, i)) {
		//do something with i
	}
}

/*另一种格式化的变种*/
var i,
	hasOwn = Object.prototype.hasOwnProperty,
	myObj = {};
for (i in myObj) if (hasOwn.call(myObj, i)) {
		//do something with i
}

/*
	不要增加内置的原型
		会严重影响可维护性
		最好不要给内置的原型增加属性
*/
/*为原型添加方法的模式*/
if(typeof Object.prototype.myMethod !== "function"){
	Object.prototype.myMethod = function(){
		//do something
	};
}

/*
	switch模式
		避免使用swith穿越

	避免使用隐式类型转换
		比教语句使用===和!==

	避免使用eval及其相关的Function、setInterval、setTimeout

	使用parseInt()的数值约定
		parseInt的第二个参数是解析的进制,不要忽略这个进制数

	JS中无法定义常量
		使用一个下划线前缀来标识受保护属性,两个下划线前缀来标识私有属性
*/

你可能感兴趣的:(读书笔记,javascript)