在javascript中,函数是第一型对象(First-class Object),可以从以下几个方面来理解。
可以作为参数进行传递
可以赋值给变量、数组或者其它对象的属性
可以嵌套在函数内,就是说函数里面可以再定义函数
可以通过字面量创建,就是匿名函数
可以作为函数的返回值进行返还,就是说可以return一个函数
可以拥有属性和方法,所以说,函数就是一个对象
可以被调用,通常是异步方式
函数的声明方式
1、普通函数
function funcName(param1,param2,...){
return ...
}
2、匿名函数
var name = function(param1,param2,...){
return ...
}
3、内联函数
var name = function funcName(param1,param2,...){
return ...
}
4、构造器函数
function FuncName(param1,param2,...){
this.xxx = param1;
this.xxx = param2;
...
}
5、立即函数
(function(param1,param2,...){
return ...
})(arg1,arg2,...);
var a = function(param1,param2,...){
return ...
}(arg1,arg2,...);
!function(param1,param2,...){
return ...
}(arg1,arg2,...);
+function(param1,param2,...){
return ...
}(arg1,arg2,...);
说明:构造器函数就是其他语言中的“类”,需要用new关键词进行实例化,通常是名词,按编程惯例以大写字母开头。param1,param2是形参,arg1,arg2是实参。立即函数的本质是把function(){}变成表达式,然后执行,所以我们不能直接用function(){}(),必须先通过括号、赋值、逻辑运算符或者数字运算符把function(){}变成一个表达式,然后加上括号才能执行。
函数的属性和方法
函数是一个对象,所以它也有自己的属性和方法。
name属性:函数的名称
length属性:函数形参的个数
prototype属性:指向该函数的原型对象
call()方法和apply()方法:是间接调用该函数的方法,第一个参数是调用上下文,就是函数内部this的指向。
bind()方法:将函数绑定到某个对象上
toString()方法:返回字符串,一般是函数的完整源码
函数的调用方式
1、作为函数调用:函数名称(); 函数中的this === window
2、作为对象的方法调用:对象.方法名(); 函数中的this === 对象
3、作为构造器调用:需要配合new操作符,而且函数中不能有显式的return返回对象。函数中的this === 实例
4、使用call或者apply调用:重新指定函数中this的指向,即函数上下文context,使用方式如下。
要调用的函数或方法.apply(context, 参数数组)
要调用的函数或方法.call(context, 参数列表)
总结:以上4种方法都可以调用某个函数(如果函数是某个对象的属性,就称为“方法”),区别就是函数中的this指向不同。函数被调用时,会隐式传递两个参数this和arguments,其中arguments表示传递的实参,它是一个类数组。