递归
函数的递归就是在函数中调用自身
举个例子:
斐波那契数列,又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
function fn (n) {
return n < 2 ? 1 : fn(n-1) + fn(n-2);
}
var count = fn(0);
console.log(count);
闭包
闭包就是函数它可以继承并访问自身所被声明的函数作用域内的变量
举个例子:
function fn () {
var num = 1;
return function () {
return num;
}
}
var result = fn();
console.log(result());
一般情况下,函数的作用域及其所有变量都会在函数执行结束后被销毁,但是,在创建了一个闭包以后,这个函数的作用域就会一直保存到闭包不存在为止
原型
__proto__和prototype
1.__proto__和prototype属性都是都是对象独有的
2.prototype属性是函数独有的,但是js中函数也是一种对象,所以函数也拥有__proto__和prototype属性 __proto__属性都是由一个对象指向一个对象,即指向它们的原型对象,这个属性的作用是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象里找,如果父对象也不存在这个属性,则继续往父对象的__proto__属性所指向的那个对象里找,直到找到为止,如果到了原型链的顶端null还是没有找到,那么就会报错。
prototype属性是函数独有的,它是一个函数指向一个对象,含义是函数的原型对象,它的作用是包含可以由特定类型的所有实例共享的属性和方法,也就是让该函数所实例化的对象们都可以找到公用的属性和方法
任何函数在创建的时候,会默认创建prototype对象
继承
Javascript函数通过原型和原型链实现继承
原型链继承
//父类
function person (name) {//给构造函数添加参数
this.name = name;
this.num = function () {
alert(this.name);
}
}
person.prototype.age = 10;//给构造函数添加了原型数据
function A (name) {
this.name = 'wuzhongsheng';
}
A.prototype = new person();
var B = new A;
console.log(B.age);
console.log(B instanceof person);//判断元素是否在另一个元素的原型链上
原型式继承
//父类
function person (name) {//给构造函数添加参数
this.name = name;
this.num = function () {
alert(this.name);
}
}
person.prototype.age = 10;//给构造函数添加了原型数据
//封装一个函数容器,输出对象和承载继承的原型
function content (obj) {
function fn() {}
fn.prototype = obj;//继承了传入的参数
return new fn();
}
var A = new person();//拿到父类的实例
var B = content(A);
console.log(B.age);//输出10,继承了父类函数的属性