函数入门
函数及函数式的概念之所以如此重要,其主要原因在于: 函数是执行过程中的主要模块单元
除了全局JavaScript代码(即内嵌脚本)在页面构建的阶段执行,我们编写的所有的脚本代码都将在一个函数内执行。
函数是第一类对象(一等公民)
就是说函数拥有对象的所有能力。
函数是特殊的对象,其特殊之处在于:函数是可调用的
对象的常用功能:
1.对象可以通过字面量来创建
2.对象可以赋值给变量、数组项,或其他对象的属性
3.对象可以作为参数传递给函数
4.对象可以作为函数的返回值
5.对象可以动态创建和分配属性。
(动态创建:var ninja = {}; 分配属性:ninja.name = “Hanzo”)
对象有的功能,函数也有:
1.函数可以通过字面量创建
function ninjaFunction() {}
2.函数可以赋值给 变量,数组项或其他对象的属性
3.函数可以作为参数传递给函数
4.函数可以作为函数的返回值
5.函数可以动态创建和分配属性
(动态创建:var ninjaFunction = function() {}; 分配属性:ninjaFunction.ninja = “Hanzo”)
回调函数
概念:在执行过程中,我们建立的函数不会立即被执行,而是会被其他函数在稍后的某个合适时间点时调用
常用的回调函数:单击一次按钮、从服务端接收数据、UI动画的一部分。
可以在表达式出现的任意位置创建函数
简单的回调函数那个例子–改进之后:
代码更紧凑和易于理解(把函数定义在函数使用处附近)。
当一个函数不会在代码的多处被调用时,该特性可以避免用非必需的名字污染全局命名空间
函数作为对象的乐趣
像为对象分配属性一样,为函数分配属性:(重要)
1.存储唯一函数集合:为函数加一个id属性
2.将函数之前计算得到的结果存储到一个对象中,并且将此对象作为函数的属性。之后每次调用函数计算时,先检查那个对象身上是否有之前计算好了的值,有的化就直接返回,没有的话再执行函数计算。
函数定义
1.函数声明
2.函数表达式
3.箭头函数
4.生成器函数
注意:
如何区分函数声明和函数表达式?
看函数的位置。在代码中作为一个独立的语句存在的函数就是函数声明;总是作为其他表达式的一部分的函数就是函数表达式(作为赋值表达式的右值,或者作为其他函数的参数)
也正是因为函数声明式作为一个独立语句存在的,所以函数名式强制性的;
也正是因为函数表达式总是其他表达式的一部分,所以其函数名不是强制性的。(因为有其他替代方式)
(因为函数生来就应该是被调用的,而我们通常是通过函数名来调用函数。
如果不给函数声明指定名字的话,那它就没有办法被调用,就像一个人,没有名字的话我们就没办法让他直到我们在叫他。
而函数表达式作为其他表达式的一部分,除了函数名之外,我们还可以通过其他方式叫他。例如:如果函数表达式被赋值给了一个变量,那么我们就可以叫这个变量。
函数的实参和形参
函数形参是在函数定义时指定的。
函数实参则与函数的调用相联系。它是函数调用时所传给函数的值。
如果实参的数量大于形参,那么额外的实参不会赋值给任何形参。
如果形参的数量大于实参,那么那些没有对应实参的参数则会被设为undefined
剩余参数和默认参数
剩余参数注意:
只有最后一个参数才能使剩余参数,试图把省略号发给到不是最后一个形参的任意形参之前都会报错。
默认参数注意:
可以为默认参数赋任何值,既可以是数字或者字符串这样的原始类型。也可以是对象、数组,甚至函数这样的复杂类型。
每次函数调用时都会从左到右求得参数的值,因此,为后面的默认参数赋值时可以引用前面的默认参数。
使用默认参数注意:
尽管有这样的功能,但是强烈建议小心使用。因为它不能提高代码的可读性。
但是在适当的时候使用默认参数——避免空值,或作为配置函数的简单标记,能够带来简洁优雅的代码