1、函数定义的两种方式:
函数申明
和函数表达式
函数申明:
function functionName(arg1,arg2,....) {
//代码执行块
return ..;
}
函数表达式:
var fn = function() {
//代码执行块
return ..;
}
区别:
函数申明,申明提升,可以提升到作用域顶端,即先使用后申明
函数表达式,也即
匿名函数
(关键字function后面直接括号),就等同于变量的赋值,虽然变量也能提升,提升到前面去是个undefined
,依然会出错
共同点:
函数是个对象,是Function构造函数的一个实例,因此,函数名或变量名都是指向函数对象的一个指针
2、因为函数是对象,所以有方法
方法: 函数自己的方法
和Function.prototype方法
Function.prototype:
就是函数实例通过原型链继承的一些方法,好像仿佛也没有什么方法
函数自带方法和属性:
属性:
length: 函数参数个数
arguments对象: 类数组,用来存储函数的参数
this对象:指向调用函数的执行环境
方法:
call(obj,arg1,arg2,...);
apply(obj,[arg1,arg2,...]);
obj都是指向函数的作用环境对象
eg:
var color = 'red';
function sayColor() {
alert(this.color);
}
var o = {
color: 'green'
}
sayColor(); //'red'
sayColor.call(o); //'green'
sayColor.apply(0); //'green'
这两个方法本质,不在于【传递参数的方式不同】,而是可以任意改变【函数作用的对象】,这个才牛