JavaScript——递归,嵌套和闭包
来源:互联网 发布:知善恶树英文 编辑:程序博客网 时间:2024/06/07 02:35
关于函数创建的三种方式以及递归,嵌套和闭包的概念经常容易搞混。
函数定义的三种方式: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的参数和变量的访问。
- JavaScript——递归,嵌套和闭包
- JavaScript——递归,嵌套和闭包
- javaScript:嵌套、闭包
- javascript递归与闭包
- 嵌套函数和闭包
- JavaScript学习—闭包和this
- 闭包——嵌套函数
- javascript—闭包
- javascript—闭包
- php 嵌套函数 闭包 嵌套函数 + 递归调用的 Fatal错误分析
- 什么是函数嵌套和递归
- 函数嵌套和函数递归
- java获取递归获取嵌套压缩包(zip和rar)中的所有文件
- 深入javascript——作用域和闭包
- 深入理解javascript原型和闭包——this
- 【JavaScript】——匿名函数和闭包
- 深入理解javascript原型和闭包(6)—继承
- 深入理解javascript原型和闭包系列 深入理解javascript原型和闭包(0)——目录
- centOS6.6系统中rpm安装 MySQL-5.6.30
- codeforces 9D DP
- iOS多线程总结
- myEclipse创建maven项目
- ASP.NET的路由系统:路由映射
- JavaScript——递归,嵌套和闭包
- vi vim的使用
- Redis之五种数据类型的简单增删改查
- REDIS CLUSTER简单安装配置
- 括号配对问题
- linux的setjmp函数和longjmp函数
- Caffe图片特征提取(Python/C++)
- ASP.NET的路由系统:根据路由规则生成URL
- 求教 oracle sql 能不能在条件为空时查询全部数据??纯sql写 谢谢