定义函数一般是有三种方法:function语句、Function()构造函数、定义函数直接量,无论使用那种定义方法,他们都是Function类型的实例,并将继承原型对象的方法和属性。
1.function语句(声明函数)
语法格式: function 函数名(参数1,参数2...){
函数体;
}
例如:
function shit(a,b){
alert(a+b);
}
2.函数表达式(函数字面量)
语法格式:var 变量名=function(参数1,参数2...){(在这里相当于把一个匿名函数赋值给一个变量)
函数体;
}
例如:
var p=function(a,b){
console.log(a%b);
}
3.Function构造函数:
语法格式:var 变量=Function(“参数1”,“参数2”,“参数3”...,“函数体”)(相当于一个表达式,而不是作为一个结构,看到没有花括号就知道啦,参数和函数体都要加“”)
例:var add=new Function(“a”,”b”,”return a*b”);
综合一下看看,相同之处在于:
都是Function对象的实例,继承Function对象所有默认或者自定义的属性和方法。(这句话怎么理解呢?大概就是这个意思:Function类/对象可以定义任何函数,他直接构造的函数就是Function构造函数,用function声明一下就是声明函数,构造个匿名函数赋值给变量就是字面量函数,总之Function对象就是爸爸!就像我一样!你们懂我意思吧。。。)
不同之处在于:
解析器优先解析声明函数(所有的),解析器会把所有的声明函数放在所有调用函数之前。(牛逼!)
对于Function构造函数,其实从表达形式上面看,它和函数表达式类似,但是一般用的比较少,原因在于:JS解析器在解析代码时,并非一行行地进行解析和执行的,而是一段段地进行解析和执行,所以在同一段代码里面,解析器总会将函数声明和函数表达式优先提取出来进行解析,只有当解析和执行完之后才会按顺序执行其他的代码,而Function构造函数并非提前执行,而是动态执行,所以每次循环调用时,函数声明和函数表达式被解析执行完之后就不会从头再重新进行编译,而Function每次循环调用时都需要动态编译一次,效率很低(从这里我学到了,做人要脚踏实地,切不可眼高手低)。
那么构造函数在什么时候用呢?
如果只是一个单独的对象,直接使用字面量就行了:
比如:
var person = {
name:'postbird',
address:'earth',
sayHello:function(){console.log('Hello,I am ' + this.name);}
};
如果你的对象有很多实例,或者涉及继承或者构造函数传参
function Person(name,address){
this.name = name;
this.address = address;
}
Person.prototype.sayHello = function(){
console.log('Hi I am ' + this.name);
}
var p1 = new Person('postbird','earth');
var p2 = new Person('ptbird','month');
看上面的例子:
我们需要的属性就是name和adress这两个,而且需要多次使用,总不能用一次写一遍把,咋办呢,找个模板吧,把这两个属性让他用双手接着,等我们需要用的时候,把模板抢过来,用new方法初始化一下,加上自己要用的value,传递给一个参数,OJBK。
总的来说,构造函数应用比较广泛,如果只是简单地对象,使用字面量就够了。
构造函数在对象实例化、继承等应用还是比较多的
说到对象实例化,再补充几句,实例化就是把抽象的东西转化为具体,比如吧水果做为对象(万物皆对象),它就属于抽象,
水果嘛,当然包括很多咯,比如西瓜、草莓、橘子、芒果,先就举着四个,这四个都叫做水果的实例:
水果当然有很多特征:大的、小的、红的、黄的、南方的、北方的、圆的、扁的先就用这几个。
我们把这些属性都会附加给水果,当我们选择大的、红的、北方的、圆的属性的时候,我们就知道要选的是西瓜,当然也可以倒过来说,这就叫做对象实例化。
如果只是一个单独的对象,直接使用字面量就行了:
比如:
var person = {
name:'postbird',
address:'earth',
sayHello:function(){console.log('Hello,I am ' + this.name);}
};
如果你的对象有很多实例,或者涉及继承或者构造函数传参
function Person(name,address){
this.name = name;
this.address = address;
}
Person.prototype.sayHello = function(){
console.log('Hi I am ' + this.name);
}
var p1 = new Person('postbird','earth');
var p2 = new Person('ptbird','month');
总的来说,构造函数应用比较广泛,如果只是简单地对象,使用字面量就够了。
构造函数在对象实例化、继承等应用还是比较多的