8.JavaScript中的函数

1.概述

函数就是一段可以反复调用的代码块。函数还可以接受输入的参数,不同的参数会返回不同的值。

1.1函数的声明

1.1.1function命令

function print(s) {
    console.log(s);
}
print(a);

1.1.2函数表达式

var print=function (s) {
    console.log(s);
};
print(w);

1.1.3Function构造函数

var add=Function(
        'x',
        'y',
        'return x+y' 
);

//等同于
function add(x,y) {
    return x+y;
}

你可以给构造函数传递任意参数,只有最后一个参数会被当做函数体,如果只穿一个参数,该参数就是函数体。
注:这种函数声明的方式十分的不直观,所以不推荐使用。

1.2函数的重复声明

如果同一个函数被多次声明,后面的声明就会覆盖前面的声明。

1.3圆括号运算符,return语句和递归

调用函数的时候,要是用圆括号运算符,圆括号之中的,可以加入函数的参数。

function add(x,y){
  return x+y;
}

add(1,5);

函数可以调用自身,这就是递给,如下:

function fib(num) {
    if (num==0) return 0;
    if (num==1) return 1;
    return fib(num-2)+fib(num-1);
}

fib(6)   //8

1.4函数的属相和方法

1.4.1函数的name就是紧跟在function函数关键字之后的。

1.4.2函数的length属性返回函数预期传入的参数的个数,级定义之中的函数。

1.4.3函数的toString()方法,返回函数方法的源码和内部的注释。

function f() {
  a();
  b();
  c();
}

f.toString()
// function f() {
//  a();
//  b();
//  c();
// }

function f() {/*
  这是一个
  多行注释
*/}

f.toString()
// "function f(){/*
//   这是一个
//   多行注释
// */}"

2.函数的作用域

在JavaScript中,一种是全局作用域,变量在整个程序中一直存在,所有的地方都可以读取,一种是局部变量域,变量只可在函数的内部可以调用。

3.函数的默认传值

function f(a){
  a = a || 1;
  return a;
}

f('') // 1
f(0) // 1

4.函数的闭包

闭包是JavaScript语言的一个难点,也是他的特点,很多高级应用都需要考闭包实现。

var n = 999;

function f1() {
  console.log(n);
}
f1() // 999

-------------------------------------------
function f1() {
  var n = 999;
}

console.log(n)
-------------------------------------------
function f1() {
  var n = 999;
  function f2() {
  console.log(n); // 999
  }
}
-------------------------------------------
function f1() {
  var n = 999;
  function f2() {
    console.log(n);
  }
  return f2;
}

var result = f1();
result(); // 999

-------------------------------------------
function createIncrementor(start) {
  return function () {
    return start++;
  };
}

var inc = createIncrementor(5);

inc() // 5
inc() // 6
inc() // 7