1.函数分为函数声明与函数表达式,函数声明一定会带有函数名称,函数表达式不一定带有函数名称;
2.函数表达式是可以赋值表达式的一部分;
3.在javascript解析过程中,函数声明被提前解析到作用域的顶部,因此,在一个作用域中,不管函数声明在哪个地方,都能调用它
4.函数表达式被赋值给一个变量时,变量被预解析到顶部,但函数表达式不会提前到顶部,因此,只能在它后面调用它的值;
5.函数声明不能出现在条件判断语句,循环语句及with语句中,只能用函数表达式来替代
6.函数调用方式有四种:
作为函数调用;函数声明调用时,是作为全局变量调用,因此,它的调用上下文是全局,其this指向全局
作为方法调用;函数表达式在作为方法调用时,其this指向调用的对象,每个方法内都隐性的传入一个该对象的实参
作为构造函数调用
用call,apply调用,在任何地方都可以用call,apply来调用,可以显性的指明this的指向
7.命名的函数表达式,其函数名称在ie6-8中会泄露到外部
var a = function fun(){}
typeof fun //IE6-8输出function
8.在函数体内,局部变量的优先级会高于同名的全局变量,因此,在函数内声明的局部变量或者函数参数中带有的变量和全局变量重名,那么全局变量会被局部变量所说遮盖
9.作用域链:
如果将一个局部变量看做是自定义实现的对象的属性来看的话,每一段javascript代码都有一个与之关联的作用域链,这个作用域链是一个对象列表或者链表,这组对象定义了这段代码“作用域中”的变量;
当定义一个函数时,它实际上保存一个作用域链,当调用这个函数时,它创建一个新的对象来存储它的局部变量,并将这个对象添加至保存的那个作用域上,同时创建一个新的更长的表示函数调用作用域的“链”