/*
基本技巧
编写可维护性的代码
阅读性好
具有一致性
预见性好
看起来如同一个人编写
有文档
尽量少用全局变量
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模式》--第二章:基本技巧
最新推荐文章于 2021-10-16 14:55:18 发布