JS学习笔记——函数

JavaScript学习笔记——函数

函数的概念

通过函数可以封装任意多条语句,而且可以在任何地方,任何时候调用执行。

函数对象

JavaScript中的函数就是对象。函数对象连接到Function.prototype该原型对象本身连接到Object.prototpye)。

每个函数在创建时会附加两个隐藏属性:函数的上下文和实现函数行为的代码(当JavaScript创建一个函数对象的时候,会给该对象设置一个”调用“属性。详见ECMAScript规范的”13.2 Creating Function Objects“)

函数的定义

函数声明语句

1
2
3
function sayHi () {
console.log('Hi!')
}

函数定义表达式

1
2
3
4
5
6
var sayYes = function () {
console.log('Yse!')
}
var sayHello = function foo() {
console.log('Hello!')
}

两种定义方式的区别

  • 函数名:以声明式方式定义的函数,实际上声明了一个变量并把函数对象赋值给它。 而以表达式方式定义的函数,函数名是可选的。如果一个函数定义表达式包含名称,函数的名称将成为函数内部的一个局部变量。
  • 声明提前:以声明式方式定义的函数,函数声明语句”被提前“到外部脚本或者外部函数作用域的顶部,所以可以被在它定义之前的代码调用。而函数定义表达式,会先声明一个变量,被声明的变量也会提前。但是在代码未执行完将函数赋值个这个变量的操作之前。这个函数是无法被调用的。

函数的参数

JavasScript中函数定义并不需要指定函数形参的类型,函数调用也不会对实参进行任何类型检查,甚至实参和形参个数不同也不会出现问题。原因是ECMAScript中的参数在内部是使用一个类数组的arguments对象来表示的。

形参

当调用函数时传入的实参比函数声明时指定的形参个数要少的时候,剩下的形参都会被设置为undefined

可以通过判断if语句或者||运算符来实现参数的可选。

实参、实参对象

当调用函数时传入实参个数超过形参,没有办法直接获得未命名值的引用。而使用实参对象arguments可以解决这个问题。在函数体内arguments是指向实参对象的引用

arguments是一个类数组对象,可以通过数字下标获得传入函数的实参值。

在严格模式下和ECMAScript 5标准中,arguments是只读的。

函数的返回值

函数的4种调用模式