JavaScript学习笔记——函数
函数的概念
通过函数可以封装任意多条语句,而且可以在任何地方,任何时候调用执行。
函数对象
JavaScript中的函数就是对象。函数对象连接到Function.prototype
该原型对象本身连接到Object.prototpye
)。
每个函数在创建时会附加两个隐藏属性:函数的上下文和实现函数行为的代码(当JavaScript创建一个函数对象的时候,会给该对象设置一个”调用“属性。详见ECMAScript规范的”13.2 Creating Function Objects“)
函数的定义
函数声明语句
|
|
函数定义表达式
|
|
两种定义方式的区别
- 函数名:以声明式方式定义的函数,实际上声明了一个变量并把函数对象赋值给它。 而以表达式方式定义的函数,函数名是可选的。如果一个函数定义表达式包含名称,函数的名称将成为函数内部的一个局部变量。
- 声明提前:以声明式方式定义的函数,函数声明语句”被提前“到外部脚本或者外部函数作用域的顶部,所以可以被在它定义之前的代码调用。而函数定义表达式,会先声明一个变量,被声明的变量也会提前。但是在代码未执行完将函数赋值个这个变量的操作之前。这个函数是无法被调用的。
函数的参数
JavasScript中函数定义并不需要指定函数形参的类型,函数调用也不会对实参进行任何类型检查,甚至实参和形参个数不同也不会出现问题。原因是ECMAScript中的参数在内部是使用一个类数组的arguments
对象来表示的。
形参
当调用函数时传入的实参比函数声明时指定的形参个数要少的时候,剩下的形参都会被设置为undefined
。
可以通过判断if
语句或者||
运算符来实现参数的可选。
实参、实参对象
当调用函数时传入实参个数超过形参,没有办法直接获得未命名值的引用。而使用实参对象arguments
可以解决这个问题。在函数体内arguments
是指向实参对象的引用
arguments
是一个类数组对象,可以通过数字下标获得传入函数的实参值。
在严格模式下和ECMAScript 5标准中,arguments
是只读的。