关于函数创建的三种方式以及递归,嵌套和闭包的概念经常容易搞混。
函数定义的三种方式:1.声明式函数(标准的关键字function+函数名+(参数列表)+{函数主体})
例如:function functionname(param1,param2,......,paramn)
{function statment}
2.匿名式函数(将函数赋予的变量+构造函数Function+(参数))
例如:var variable=new Function("param1","param2",......,"paramn","function body");
3.函数字面量:只会被浏览器解析一次(匿名和非匿名两种)
A.匿名形式的(可以作为参数传递给另一个函数)
var func=function (param1,param2,......,paramn){function satament}
B.非匿名式的(适用函数内部,只有函数内部的代码才能通过其名称调用它,非常适合与递归)
var func=function functionname(param1,param2,......,paramn){function statment}
递归,嵌套和闭包的理解:
1.递归:一般是用来针对非匿名形式函数字面量
调用自身的函数称为递归函数;
缺点:递归占用的内存和资源比较多,同时难以实现和维护。
优点:在处理DOM之类的树形结构数据时,非常适合用递归。
例如:function commonFunction()
{
var myFunc=function specialFunction(param1,param2,......,paramn)
{
function body;//存在某个判断条件使递归最终跳出循环
return specialFunction(param1,param2,......,paramn);
}
var result=myFunc(param1,param2,......,paramn);
}
2.嵌套:不适用于匿名式函数(动态式),因为匿名式函数每次使用时都需要重构。
在某一函数内部存在了另一个函数就会形成嵌套。对于嵌套函数来言,内部函数在外部函数作用域内执行,并拥有对外部函数的参数和变量的访问权。而外部函数没有访问内部函数的权限。
内部函数通过外部函数传递给应用程序时将直接调用它,它可以使用作为参数传递给外部函数的参数值。
例如: <script>
function outerFunc(base)//外部函数
{
var outerStr="!!!!";
return function(ext){ //内部函数
return base+ext+outerStr;
}
}
function myApplication()//应用函数
{
var baseStr=outerFunc("Hello");//创建对内部函数的访问
var newStr=baseStr("World");
alert(newStr);
}
</script>
3.闭包:可以在嵌套的基础上理解闭包;当嵌套中的内部函数是以:A.内部对象形式创建的一个函数字面量B.并将其通过调用外部函数返回给主调应用程序中的一个变量,这就会形成一个JavaScript闭包。
应用:用来获取内部函数中的变量值。因为外部函数a没有访问内部函数b中变量和参数的权限,所以为了能够使用内部函数b中的参数或变量,我们可以在内部函数b里面建立一个对象形式的函数字面量c,这样这个新建的函数字面量c就可以访问内部函数b中的变量和参数。通过将内部函数b赋值给外部函数a中的变量,就可以通过外部函数a中的这个变量模拟函数字面量c,实现对内部函数b的参数和变量的访问。
版权声明:本文为博主原创文章,未经博主允许不得转载。