1、函数定义表达式
var fun = function(){}
2、函数声明表达式
不能出现在循环、条件判断、或者try/cache/finally以及witch中
function fun(){}
3、函数的提升
函数定义式:类似于变量提升,只会提升函数变量名,不会提升函数体,不能在函数定义之前使用。
函数表达式:整体提升。
4、方法调用
作为对象的内置方法被进行调用
当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。如果调用表达式包含一个 提取属性的动作(a.name或a[name]),那么他就是被当做一个方法调用。
5、函数调用
不是作为一个对象的属性进行调用
6、方法调用和函数调用的区别
this的指向问题,方法调用中的this指向调用他的对象,而函数调用的this指向不是Windows(非严格模式下)就是undefined(严格模式下)
7、间接调用 apply() 和 call()
apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。
call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。
8、可选形参
9、实参对象
在函数体内,标识符arguments是指向实参对象的引用,实参对象是一个类数组对象。可以通过arguments[所在下标]获取到传入函数的参数
10、callee和caller(非严格模式下)
caller 非标准
实参对象arguments的属性,指代调用当前正在执行的函数的函数。常用于匿名函数中通过callee来递归调用自身。
var fun = function(){
if(x<=1) return 1;
return x*arguments.callee(x-1);
}
11、闭包
理解关键:函数定义时的作用域链到函数执行时依然有效
如果这个函数定义了嵌套的函数,并将他作为返回值返回,或者储存在某处的属性里,这时就会有一个外部引用指向这个嵌套的函数。他就不会被当作垃圾回收,并且他所指向的变量绑定对象也不会被当作垃圾回收。
12、bind()方法
将函数绑定至某个对象,传入bind的实参也会绑定值this
13、Function() 构造方法 (不常用)
var f = new Function('x','y','return x*y')
注意点:权威指南(P193)
14、检测对象是否是正真的函数对象,检测其class属性
function classof(o){ //利用该方法,可以判断对象类型
if(o===null) return "Null";
if(o===undefined) return "Undefined";
return Object.prototype.toString.call(o).slice(8,-1);
}
15、高阶函数
高阶函数:接受一个或多个函数作为参数,并返回一个新函数;
16、不完全函数
17、记忆
小知识点:
1、没有返回值的函数有时称为过程
2、没有形参的构造函数调用可以省略圆括号
3、isArrayLike(x) 判断x是否位数组或者类数组 (jquery中的方法)
4、isFinite(x) 用于检查x是否为无穷大:如果数字是NaN或者是正负无穷大,则返回false
5、isArray(x) 判断x是否为数组
6、typeof x ==="function" 判断x是否为方法
7、函数作为对象的属性调用时,函数就称为方法
8、函数的lenght属性返回的是函数形参个数