函数是一个具有功能的对象,函数的实参可以是个对象,也可以是个函数,
1.构造函数
var fun = new Function()
2.函数的声明创造
function 函数名([形参1,形参2,形参3...]){ 语句... } //调用 函数名()函数里的形参是可选的,写不写都可
3.函数表达式创造函数
var 函数名 = function ([形参1,形参2,形参3...]){ 语句... } //调用 函数名()函数名()-->调用函数,相当于使用函数的返回值函数名 -->函数对象,相当于直接使用函数对象
4.立即执行函数
(function(){alert('哈哈')})()函数执行完,立即执行,只会执行一次
5.利用构造函数的方法,创建对象
1.工厂方法创建的对象都是object类型,无法区分不同类型的对象,我们可以创建一个构造函数,用来创建对象2.构造函数习惯上首字母大写3.普通函数直接调用,而构造函数需要使用new关键字来调用
执行流程: 1.立即创建一个新的对象 2.将创建的对象设置为函数中的this,在构造函数中使用this引用新建对象 3.逐行执行函数中的代码 4.将新建的对象作为返回值返回 构造函数优化工厂方法创建对象 function Person(name,age){ this.name = name; this.age = age; this.sayname = function(){ console.log('大家好,我是'+this.name+',今年'+this.age+'岁了') }; } var per = new Person('孙悟空',500); //通过Person创建的per对象 var per1 = new Person('猪八戒',28,); per.sayname() console.log(per) console.log(per1) 优化版:把函数里的sayname方法取出来,减少每次调用函数时都要重新创建一个方法的时间,效率优化 function Person(name,age){ this.name = name; this.age = age; this.sayname = fun; } function fun(){ console.log('大家好,我是'+this.name+',今年'+this.age+'岁了') } var per = new Person('孙悟空',500); var per1 = new Person('猪八戒',28,); per.sayname() console.log(per) console.log(per1) 项目中可能会遇见同样的函数名,避免这一现象,可以利用原型对象进行优化 function Person(name,age){ this.name = name; this.age = age; } Person.prototype.sayname=function (){ console.log('大家好,我是'+this.name+',今年'+this.age+'岁了') } var per = new Person('孙悟空',500); var per1 = new Person('猪八戒',28,); per.sayname() console.log(per) console.log(per1) 使用同一构造函数创建的对象,称为一类对象/一个类 将通过一个构造函数创建的对象,称为该类的实例
6.instomceof
使用instomceof可以检查一个对象是否是一个类的实例 语法: 对象 instomceof 构造函数所有的对象都是object的后代,所以任何对象和object做instomceof检查时都会返回true
7.函数嵌套
函数里面嵌套的函数调用时只能在里面使用,不能在全局使用 function fun() { var a = 30 console.log(a) function say() { var b = 20 console.log(b) } say() } fun()但是用函数表达式的方式去构造函数是可行的,因为函数被声明了,上者没被声明属于全局 var fun = function() { var a = 30 console.log(a) say = function() { var b = 20 console.log(b) } } fun() say()