概述
函数声明有三种方式,function命令、函数表达式、Function构造函数。
函数表达式可以具名function命令,使该函数名在函数体内部有效,如使用typeof命令等等。在函数体外此具名函数无法使用。
函数声明会提升作用域到顶部,考虑到变量也会作用域提升,且函数内可使用变量,所以函数应该作用域提升至变量之下。如果使用表达式赋值函数,类似执行流程var=f f=function(){}且不能赋值部分不进行变量提升,故f()不能在表达式前使用。
函数如果没有return任何表达式,就返回undefined
javascript将函数看作一等公民,等同于其它值(数值、字符串、布尔值等等),所以凡是可以使用值的地方都可以使用函数。
函数的属性和方法
函数有一个name属性,如果是具名函数那就是具名函数的名称,如果是表达式赋值的非具名,那就是表达式赋值的变量名称。可以在函数体内部判断传入的函数参数的名称。
函数的length表示函数预期传入的参数的个数。
函数的tostring方法返回的是函数的字符串形式源码。原生函数返回`function (){[native code]}`。
函数作用域
var在函数内部可以是局部变量,在其他任何地方都会提升为全局变量
函数的作用域是它在声明时所在作用域,与运行时作用域无关。
参数
函数的参数不是必须的,但是如果要省略靠前的参数,则必须显式的传入undefined。
传递方式
函数参数如果原始类型的值,相当于值的copy,在函数体内改变参数值不会影响到函数外面的值。
函数参数如果是复合类型的值,相当于地址的传递。如果对于整个地址从新赋值也不会造成函数外值的变化。
arguments参数
arguments对象是函数参数的类数组集,依次对应各个函数的参数。正常情况下arguments对象与函数参数具有联动关系(即一方修改后相互都修改),但是在严格模式下将不具有联动关系。
arguments有length属性,可以判断函数调用时传入了几个参数。
arguments对象有callee属性,返回它的原函数本身,达到调用函数自身的目的,但是严格模式下禁用。
闭包及应用
闭包就是函数的内部可以读取外层函数变量的函数,闭包最大的特点就是它可以记住它声明时的作用域,可以作为函数内外沟通的桥梁。比如:f1中有f2,f2中使用f1的变量,f1返回f2,则在最外层调用f1的时候返回了f2,执行f2就可以做到在全局读取f1中的局部变量的效果。
闭包还能保存函数内部值使之不变,因为内层函数使用到了外层函数的变量,使得外层函数不能被垃圾回收机制回收(除非释放内层函数的引用)。使得外层函数和其内的变量持久存在。
闭包还能创建对象的私有方法、私有属性。
外层函数每次运行都会产生一个持久化于内存的新闭包,所以不能滥用闭包,容易造成内存泄露。
立即调用函数表达式
()跟在函数名之后表示立即调用该函数。如果function出现在行首,JavaScript规定将其解释成语句,此时直接加()会报错,要使其变成表达式形式解释就不会报错,列入加括号,条件运算等等。
原创总结,引用请注明出处