在javascript中,函数是第一型对象(First-class Object),可以从以下几个方面来理解。
1、普通函数
function funcName(param1,param2,...){
return ...
}
var name = function(param1,param2,...){
return ...
}
var name = function funcName(param1,param2,...){
return ...
}
function FuncName(param1,param2,...){
this.xxx = param1;
this.xxx = param2;
...
}
(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,...);
函数是一个对象,所以它也有自己的属性和方法。
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表示传递的实参,它是一个类数组。