匿名函数,普通函数,变量函数,基于对象的方法
介绍它们的优劣点(性能,执行条件,可维护性,适合大型还是小型)
Javascript有着灵活多变的函数方法,具体选用何种形式,都会极大地影响应用程序的编写方式及性能。考虑到项目的多样化,应该在各种情况下选用最为适用的方案。
普通函数
我们使用的Salad()就是这样的一个标准函数,它以function关键字开头,其后是函数名、参数列表以及函数内容本身。此函数也会返回一个通过计算而得出的数值。
1 //这是一个普通函数 2 3 function Salad(totalSlices,peopleCount){ 4 5 "use strict"; 6 7 var fairness = totalSlices * peopleCount; 8 9 return fairness; 10 11 }
如果你正在开发一个规模相对较小的javascript应用程序库,并且需要不止一次地通过复用Salad()函数进行计算,那么就可以使用这种风格的函数打包。对于这种函数执行并调用它所花的处理时间要比直接执行其中的代码更多。
匿名函数
匿名函数中没有可以复用的东西,如果只限于函数作用域内,当然可引用内部变量。
如果将Salad()写成一个大的匿名函数,而不是一个小的匿名函数或者普通函数,那么这段代码会变成这种形式。该函数定义好以后会从上而下自动执行。
用一个大的匿名函数来实现Salad()功能:
1 //这是一个匿名函数 2 function () { 3 4 "use strict"; 5 6 var body = document.getElementsByTagName("body")[0], 7 //不要在意这些变量 8 partyStarter = "starlen", 9 10 peopleCount = 18, 11 Salad = 6, 12 sliceCount = Salad * 3; 13 14 }
如果我们不打算多次调用原来那个Salad普通函数,那么将它写成一个单独的匿名函数的一部分,起执行速度更快,省去了查找并调用函数的时间。这种写法确实能提升函数的性能,但是它不能被提取反复复用。如果要重复执行这段代码,则需要进行打包。
以变量的形式编写函数
函数也可以声明为变量,它与第一个普通函数在功能上没有太大的区别,两者都能产生相同的运行效果,调用方式也一样。区别只是风格上不同,这种形式更符合面向对象/方法的开发思路。
1 //这是一个以变量形式出现的普通函数 2 var fair = function Salad(totalSlices,peopleCount){ 3 4 "use strict"; 5 6 var fairness = totalSlices * peopleCount; 7 8 return fairness; 9 }
需要注意的是,它虽然与普通函数有着相同的调用方式,但是在风格上有着明显的差别,因此在同一份源文件中两种风格的函数不能并存。
以方法形式出现的函数
我们实现在针对水果JSON搜索表单的自动完成功能时,就是使用这种结构来组织应用程序中的函数方法的。以此形态存在的函数也能产生于普通函数相同的结果,只是两者的执行路径不同而已。
如果将一个函数写成方法,那么语法与嵌套的形式将是它与普通函数之间最为显著的区别。我们把原来的函数拆分成一个salad对象和一个fruit方法,这样一来以后就可以把另外一些方法加入到salad对象中来。这样形式的应用程序中各个功能的划分与归组更加明晰。
1 //salad函数被转写成了一个对象 2 var party = { 3 4 pizza : function Salad(totalSlices,peopleCount){ 5 6 "use strict"; 7 8 var fairness = totalSlices * peopleCount; 9 10 return fairness; 11 } 12 13 };
如果应用程序规模比较大,而且其中存在着各类功能,那么以对象与方法的形式来组织函数就显得很有用了。将功能相似的方法归入同一个对象中,有助于我们更好地调整代码结构。我的这个函数代码根本就不值得用嵌套在对象中的函数来做(因为太小)。
这是我的一些常用的开发经验,基础且重要,欢迎交流