Fork me on GitHub

javascript基础知识复习(四)递归与闭包

##递归
(1)递归概念:在函数内调用函数自己,就是递归。 注意:递归要有结束条件,没有递归结束条件的递归,就是死递归。
(2)使用递归的方法:化归思想。化归思想是将一个问题由难化易,由繁化简,由复杂化简单的过程称为化归,它是转化和归结的简称。 例子:求1-100的和 利用划归思想:var sum=foo(100); 1.求foo(100)即求foo(99)+100; 2.求foo(99),即求foo(98)+99; 3.求foo(98),即求foo(97)+98; … 最后求foo(1),就是1;//这就是约束条件 最后利用递归,函数就是:

1
2
3
4
function foo( n ) {
if ( n == 1 ) return 1;
return n + foo( n - 1 );
}

利用递归可以解决很多问题,比如算出阶乘,算出斐波那契数列等;

二、闭包
(1)闭包概念:有权访问另一个函数作用域内变量的函数都是闭包。
(2)闭包的原理是作用域访问原则,及上级作用域不能访问下级作用域。
(3)闭包要解决的问题: a)闭包内的数据不允许外界访问 b)间接访问该数据
(4)我们知道js中函数就是一个小黑屋,外部是不能访问内部变量的,但是内部变量是可以访问外部变量的,所以为能从外部访问,利用作用域访问原则,在函数里面再建一个函数,这个内部函数在外部函数内部可以直接访问外部函数的所有变量,我们再在全局里获取这个内部函数的返回值,就可以实现对外部函数里变量的读取和修改。 读取:

1
2
3
4
5
6
7
8
9
function foo() {
var num = Math.random();
function func() {
return num;
}
return func;
}
var f = foo();
var res1 = f();

return只能用一次,那如何读取多个数据呢:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function foo () {
var num1 = Math.random();
var num2 = Math.random();
//可以将多个函数包含在一个对象内进行返回,这样就能在函数外部操作当前函数内的多个变量
return {
num1: function () {
return num1;
},
num2: function () {
return num2;
}
}
}
var f = foo();
console.log(f.num1());
console.log(f.num2());

使用闭包修改数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function foo() {
var name = "高金彪";
var gender = "female";

return {

getName:function () {
return name;
},
setName:function(value){
name = value;
return name;
},
setGender:function(value){
gender = value;
return gender;
},
getGender:function(){
return gender;
}

};
}
var obj = foo();
console.log(obj.getGender());
console.log(obj.setGender("雄"));

闭包的作用第一点就是上面讲了,他可以访问函数内部的变量并修改,第二点可以在函数内部创建私有空间,设置安全措施、校验之类的操作,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function foo(){
var name = "lili";
return {
getName: function () {
return name;
},
setName: function (value) {
//在这里写一些逻辑验证操作
if(value==0){
throw "名字不能为0!!";
return name;
}
else{
name = value;
return name;
}
}
}
}

最后再总结下,这里介绍了闭包的概念,基本使用,和基本作用,要加深闭包的理解还需要做很多练习。

-------------本文结束感谢您的阅读-------------

本文标题:javascript基础知识复习(四)递归与闭包

文章作者:陈晓拉尼

发布时间:2017年08月09日 - 17:08

最后更新:2018年09月23日 - 13:09

原始链接:http://yoursite.com/archives/52089.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。