JavaScript——递归,嵌套和闭包

关于函数创建的三种方式以及递归,嵌套和闭包的概念经常容易搞混。

函数定义的三种方式: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的参数和变量的访问。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 16:28:38

JavaScript——递归,嵌套和闭包的相关文章

JavaScript递归原理

JavaScript递归是除了闭包以外,函数的又一特色呢.很多开发新手都很难理解递归的原理,我在此总结出自己对递归的理解. 所谓递归,可以这样理解,就是一个函数在自身的局部环境里通过自身函数名又调用,如此反复,直到条件不满足,返回最终结果的一种情形.最简单的一个示例代码如下: function fn(a){ return a <= 1 ? a = 1 : a * fn(a - 1); } 这也是一个最经典的递归阶乘函数了,虽然这行代码表面上看起来没什么问题,但在执行如下代码,则会出现错误. va

JavaScript递归中的作用域问题

需求是这样的,从子节点寻找指定className的父节点,一开始就想到递归(笨!),Dom结构如下: <div class="layer_1"> <div class="layer_2"> <div class="layer_3"> <div id="layer_4"></div> </div> </div> </div> 先通过i

javascript深入理解js闭包(看了挺多的,感觉这篇比较透彻)

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function

Python/函数的嵌套和闭包

Python基础--函数的嵌套和闭包 一.名称空间和作用域 名称空间:Python所有有关命名的操作都是在操作名称空间,例如变量名,函数名 1.内置名称空间:Python解释器提供好的功能,解释器启动跟着一起启动,是全局作用域 2.全局名称空间:Python中顶行写的,不在函数内部定义的,都是全局名称空间,在运行的时候会产生名称空间,是全局作用域 3.局部名称空间:在一个小范围定义,只能当前范围及其子空间内运行,例如在函数内部定义的,是局部作用域 二.函数的嵌套 1.函数的嵌套调用 2.函数的嵌

函数对象/嵌套和闭包函数

一.函数对象 二.函数嵌套 三.闭包函数 一.函数对象 精髓:可以把函数当成变量去用 1.可以赋值 # func=内存地址 def func(): print('from func') f=func # 函数func赋值给变量f print(f,func) # 打印f和func的内存地址,完全相同 f() # 相当于调用了函数func() 输出: <function func at 0x02F434A8> <function func at 0x02F434A8> from fun

十八、十九穿插python沉淀之路--嵌套、闭包、递归,三者的区别

一.嵌套函数 python允许在定义函数的时候,其函数体内又包含另外一个函数的完整定义,这就是我们通常所说的嵌套定义.为什么?因为函数是用def语句定义的,凡是其他语句可以出现的地方,def语句同样可以出现.像这样定义在其他函数内的函数叫做内部函数,内部函数所在的函数叫做外部函数.当然,我们可以多层嵌套,这样的话,除了最外层和最内层的函数之外,其它函数既是外部函数又是内部函数. 定义:简单点儿理解就是函数(包括定义函数)内部定义了新函数,即一层套一层. ¥¥¥¥¥嵌套函数里面两个重要的概念:变量

javaScript 递归 闭包 私有变量

递归 递归的概念 在程序中函数直接或者间接调用自己. 跳出结构,有了跳出才有结果. 递归的思想 递归的调用,最终还是要转换为自己这个函数.    应用 function sum(n){ if(n ==1) return 1; return sum(n-1) + n } sum(100) var fib = function (n){ if(n <=2){ return 1; } return fib(n-1) + fib(n-2); } console.log(fib(5)) 数组扁平化 fun

javascript深入理解js闭包

一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需要注意,函数

JavaScript学习总结(二)——闭包、IIFE、apply、函数与对象

目录 一.闭包(Closure) 1.1.闭包相关的问题 1.2.理解闭包 二.对象 2.1.对象常量(字面量) 2.2.取值 2.3.枚举(遍历) 2.4.更新与添加 2.5.对象的原型 2.6.删除 2.7.封装 三.函数 3.1.参数对象 (arguments) 3.2.构造函数 3.3.函数调用 3.3.1.call 3.3.2.apply 3.3.3.caller 3.3.4.Callee 3.5.立即执行函数表达式 (IIFE) 3.5.1.匿名函数与匿名对象 3.5.2.函数与函数