递归
递归的概念
在程序中函数直接或者间接调用自己。
跳出结构,有了跳出才有结果。
递归的思想
递归的调用,最终还是要转换为自己这个函数。
应用
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))
数组扁平化
function flatten(arr) { return arr.reduce(function(prev,next){
return prev.concat(Array.isArray(next) ? flatten(next) : next) },[]) }
递归的两个必要因素:递归方程,递归结束条件。
闭包
闭包是指有权访问一个函数作用域中的变量的函数。
function fun(){
// 函数内部的变量,函数外部无法访问
var privateVal = "private value";
// 下面是闭包的精髓:
// 在函数内部返回一个匿名函数,匿名函数能够访问fun 函数的的变量
return function(){
return privateVal;
}
}
fun()(); // 第一个() 执行了fun 函数,返回值是一个匿名函数,第二执行了匿名函数。// 因此输出了"private value”
// 以下代码,等同于fun()();
var temFun=fun();
console.log(temFun()); // 输出:"private value"
闭包只能取得包含函数中任何变量的最后一个值
function fun(){
var result = new Array();
for(var i=0;i<10;i++){
result[i] = function(){
return i;
}
}
return result;
}
var result = fun();
console.log(result[0]()); // 为什么会输出10?
我们可以通过立即执行函数进行改造,把i 的值绑定在闭包函数内部
function fun(){ var result = new Array(); for(var i=0;i<10;i++){
result[i]=function(num){
return function(){
return num
}
}(i)
}
return result; }
var result = fun();
console.log(result[0]()); // 输出0
console.log(result[0]()); // 输出1
私有变量
创建私有变量的方法
1.构造函数
function Person(name){ this.getName = function(){ return name; }; this.setName = function(value){ name = value; } } var tc = new Person('tc'); var dj = new Person('dj'); tc.getName(); // tc dj.getName(); // dj
2.静态私有变量
(function(){
var name = '';
Person = function(value){
name= value;
}
Person.prototype.getName = function(){
return name;
}
Person.prototype.setName = function(value){
name = value;
};
})();