请先带着对标题说法的疑问,观察下面的两个片段。
//直接使用大函数
var outOm;
function om(n1,n2){
outOm=n1*n2;
alert(outOm);
//console.log(outOm);
return outOm;
}
om(2,3);
//putOm=6
//把函数套在对象里面
var outOm;
var nc = {//numerical calculation,数值计算
first:null,
om : function(n1,n2){
putOm=n1*n2;
alert(outOm);
//console.log(outOm);
return outOm;
}
}
nc.om(2,3);
//outOm=6
实际上上面的两段代码的效果是一样的,都是计算两个传入函数/方法“om()”的参数的乘积并且反馈。
而它们有什么不一样呢?上面的函数是一个全局式函数,下面一个函数则是一个方法。
小芝士:
全局式函数就是一个放在全局环境而且嵌套层级为0的函数。换成一句人话来说,全局式函数就是放在整个代码体内的最外层的函数。
使用方法的优势比较(于全局式函数)多,一个更容易被人接受的优势就是——使用方法会比使用全局式函数更有仪式感。
(咳咳!)
如果只用全局式函数那么分类只能靠代码放置或命名,而这两个方式对于非同一人维护的代码,是及其不友好的。代码的放置倒是不容易乱,因为一般在开发前都会确认主体功能,再在划分的主体功能位置放置代码就可以保证代码的整齐。但对于长代码,这种代码放置位置来分类函数可行行为的方式就不太可行,因为要翻很久才能触到首尾,那么就更难定位,也就更难维护。命名就更恐怖了,分支功能越多,层数越深,按照“显性命名”的原则,就要求命名必须能够描述这个函数的功能,如果不使用方法,哪怕是驼峰式命名也够呛。
小芝士:
显性命名作者习惯的称呼这种命名模式的名字(绝对有语病),更符合这种命名模式的名称应该是“功能命名”,这指的是定义名描述定义物行为的命名模式。
而使用方法以上的问题就会迎刃而解了,虽然这样会导致缩进更复杂,但是比起直接使用函数,好处更多:最主要的是使用方法可以让引用更直观,便于分类与整理、调用。使用方法,就可以更加细分函数功能,统一修改主要功能名时更便利。请看事例:
//这里模仿的是一个网站的服务器文本功能,暂定为读取,写入,删除
//大函数
function textGet(){/*代码*/}
function textWriteIn(){/*代码*/}
function textUndownload(){/*代码*/}
//-//
//方法
var text = {
get:function(){/*代码*/},
writein:function(){/*代码*/},
undownload:function(){/*代码*/}
}
理论(这里指的是JS算法)上,对象内可以套理论无穷多个对象。所以一个对象里的方法也是理论无穷多的。