函数的分类
一. 递归函数
function fn1(){
if(a<1){
return a;
}else {
return fn1(a-1);
}
}
var a = fn1(5);consol.log(a)
- 应用案例:斐波那契数列;需求: 传入一个数值,返回当前数值对应位置的数列里面的值
function fib(num){
if(num==0){
return 0;
}
if(num == 1){
console.log(111)
return 1;
}
retuen fib(num-2) + fib(num-1) ;
}
var b= fib(6);
console.log(b)
二.匿名函数
三.自执行函数
- 概念:通过匿名函数实现的一个。
- 语法:
- ()() --》(function(){})()
- (function(){console.log(“123”)})()//会自动执行 - 括号的解释:第一个括号的作用是让函数变成表达式,第二个括号作用是让函数自动执行
- 作用:相当于创建了一个独立的空间,可以避免变量污染
(function(a接收的形参){
console.log(223)->执行的代码
})(123->输入的实参)
var fn1 = (function(){
console.log('123');
return function(){
console.log('3656')
}
})()
console.log();fn1()
四.回调函数(api比比皆是,js当中非常重要的一点)
- 概念:把一个函数当做一个参数传递给另外一个函数,并且在另外一个函数当中去调用这个函数。
- 写法:js当中的函数并没有关于参数类型的限制
第一种写法
在传参的时候写一个匿名函数
1.function fn1(parm1,parm2){
parm2(parm1)
console.log(parm1)
console.log(parm2)
}
fn1('你好',function(str) {console.log})
第二种写法
直接把函数名提出来在外边写函数,把函数名传进来
2.function fn1(parm1,parm2){
parm2(parm1)
}
function write(str) {console.log(str)}
fn1('你好',write)
五.闭包函数(js当中非常重要的一点)
- 闭包函数概念:当一个函数当中嵌套了另外一个函数,并且把这个函数返回,那么此时返回到函数外部的这个函数,将可以直接访问它所在作用域的全部变量。这样,通过函数嵌套的形式就形成了函数内部和函数外部的一个桥梁,从而让函数外部可以访问函数内部的所有的变量。 简单点说,当一个函数中返回了另外一个函数,这种形式即是闭包。闭包函数可以让函数外部访问函数内部的数据。
- 代码
function fn1(){
var s1 = 'hello';
var s2 = 'world';
return function(par){
<!-- var c = s1 +s2; -->
return s1 + '' + s2 + par;
}
}
fn1()('!')
console.log(fn1)
var a = fn1()('!')
console.log(a)
- 闭包函数缺点:程序长占内存,不会被销毁。容易产生内存溢出,造成数据丢失
- 垃圾回收机制:判断这个东西有没有用,如果没有用在回收
六.构造函数(js当中非常重要的一点) —对象中常用
- 概念:js当中存在诸多的数据类型,本质来说,除了null和undefined,所有的数据都是由构造函数创建出来的,采用不同的构造函数可以创建出不同类型的数据,在js中,除了null和undefined,所有的数据都可以通过构造函数的形式创建。
- 构造函数的直接量
- 直接量–创建数据的一种快捷方式
var str1 = new String("hello,world"); // 构造函数实例化
- 构造函数的分类:
- 系统内置构造函数(js内置)和自定义构造函数。
- 自定义构造函数注意点:
- 注意1:函数名-需要采用大驼峰命名法
- 注意2:使用函数的时候需要采用new 的形式创建出来,并且都是对象类型。
- 注意3:变量接收的不再是返回值,而是构造函数创建出来的一个对象
- 注意4:在构造函数当中,通过this.给未来的对象赋值
- 注意5:构造函数当中一般不设置return
- new的这种操作称之为实例化
- 构造函数的代码
function Person(name,age,sex,like){
this.username = name;
this.userage = age;
this.usersex = sex;
this.like = like;
}
var val = new Person('张三',30,'男','玩')
-
var lisi = new Person('李四',29,'女','旅游');
console.log(lisi === val);
console.log(lisi.username)
function Person(name,age,sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.sayHello = function(param) {
alert('你好 ,' + param);
}
this.showName = function() {
alert('你好,我的名字叫' + this.name + ",我的年纪是" + this.age + ",我的性别是你自己看看");
}
}
var zhangsan = new Person('张三',30,'男');
zhangsan.sayHello('尼古拉斯赵四');
zhangsan.showName();
对象调用方法的时候只能采用:变量名.函数名();如zhangsan.showName()
七.补充:构造函数和普通函数的区别
1. 调用方式不同,需要通过new 的形式来调用
2. 函数命名不同,采用大驼峰命名法
3. 函数里面this不同,普通函数当中this其实表示的是window,而在构造函数当中this表示未来的对象
4. 普通函数会用到返回值,但是构造函数当中返回值使用较少甚至不使用