javascript中的函数指的是一个特定代码块,可能包含多条语句,以通过名字来供其它语句调用以执行函数包含的代码语句。
1.声明函数
(1)构造函数(通过new创建一个函数对象)
var Person=new Function(console.log("jam"));
Person();//jam;
注:此方法不推荐使用。
(2)声明函数(通过function关键字声明函数)
function Person(name) {
console.log(name);
}
Person('jam');//jam
(3)函数表达式:
var Person=function() {
console.log('jam')
};
Person();//jam
无论通过何种方式创建函数,js中的每个函数都是一个名为Function的全局对象的实例,因此js中的每个函数都可以被视为对象。
2.函数中的arguments.
arguments是一个对象。arguments对象是所有函数的一个局部属性,本质上是一个类似于数组的对象,里面包含了所有传递给函数的参数。
function Person() {
for(var i=0;i<arguments.length,i++) {
console.log(argument[i])//jam,jirengu,hunger
}
}
Person('jam','jirengu','hunger')
//函数中传入进来的参数讲按照顺序保存在arguments中,使用argumetns[0],即可访问arguments对象中的第一个参数,依次类推。
使用arguments.length即可获得对象中的参数的数量
function getInfo(name,age,sex) {
console.log('name:',name);
console.log('age:',age);
console.log('sex:',sex);
console.log('agruments:'argumetns);
arguments[0]='valley';
console.log('name',name)
}
getInfo('hunger',28,'男') //执行结果如下:
// name:hunger
age:28
sex:男
arguments:['hunger','28','男'];//按顺序保存着函数传入进来的参数。
name:valley//arguments[0]=valley,使第一个参数的值变为了arguments。
getInfo('男') //执行结果如下:
// name:男
age:undefined;
sex:undefined;
arguments:['男'];
name:valley;
//所有的参数都是按顺序传入进来,没有传值得就是undefined;
3.函数的重载
-
简单的说函数重载就是,当两个函数名相同时,后一个函数声明会把前一个函数声明给覆盖。
function add() {
console.log("被后面的函数覆盖")
}
function add() {
console.log("覆盖前面的函数")
}
add()// 覆盖前面的函数。(执行第二个函数)
4.声明提升
和变量的声明前置一样,函数声明也会前置。即使函数执行写在前面也可以执行,因为函数声明即使在后面,也会前置。fn(); // "1" function fn(){ console.log('1'); } //这是一个简单的例子。次代码函数声明前置后为 function fn() { console.log('1') } fn();//1
下面看一个复杂一点的例子:
sayName('world');
sayAge(10);
function sayName(name) {
console.log('hello',name);
}
var sayAge=function(age) {
console.log(age;)
};
根据函数声明前置,此代码等价于以下代码:
function sayName(name) {
console.log('hello',name);
}
var sayAge;
sayName('world');//hello world
sayAge(10);//报错,sayAge is not a function
sayAge=function(age){
console.log(age)
}
当使用函数表达式的方法声明函数时,函数前置的规则和变量前置的规则一样
下面看一个函数声明前置和变量声明前置混在一起的例子
function fn(fn2) {
console.log(fn2);
var fn2=3;
console.log(fn2)
console.log(fn);
function fn2() {
console.log('fnnn2')
}
}
fn(10);
根据函数声明前置和变量声明前置,上面的代码下面的代码等价
function fn(fn2) {
var fn2;
function fn2() {
console.log('fnnn2');
}
console.log(fn2);//function fn2() {console.log('fnnn2')},因为此时fn2是一个函数。
fn2=3;
console.log(fn2);//3,此时fn2=3,
console.log(fn)//输出fn这个函数
}
fn(10);