函数来啦!

当你要编写一下反复使用的代码时就应该考虑写函数。函数到底是怎么回事呢?来个例子:

function plus ( a, b ) {
  var c = a + b;
  return c;
}
var d = plus ( 1, 5 );
console.log( d );  // 6

function关键字是定义函数必须的,plus是函数名,遵循变量名的命名规则,括号里的a和b是参数,称为形参,形参是可选的,{ }之内的代码成为函数体,其中return是返回语句,return语句是可选的。

plus ( 1, 5 )实现函数调用,函数在声明时不会运行,只有在调用时才会运行。

调用时传给函数的参数称为实参。和形参一样,实参也是可选的。调用函数后函数的运行过程是先按顺序把实参赋值给形参,然后执行函数体的代码。函数执行完毕,程序将返回调用函数的地方继续往后执行。

可以把任何类型的值作为实参传递给函数,但更常见的是把变量作为实参传递。

Javascript函数参数的传递是值传递,基本类型直接复制值(对象类型复制引用值,以后的内容)。

var n = 10,;
function fn ( a ) {
    a=30;
}
fn ( n );
console.log( n ); //10
//n还是10,因为调用的时候只是复制了n的值(10)给函数fn的参数a,就算修改了这个值,也不会影响n的值。

如果调用函数时参数传递错误,则少传递的实参对应的形参会被赋值为undefined,多传递的值默认会被忽略(当然有办法捕获这些值,只是这一章没说~)。

函数体中遇到return语句,函数会直接返回return语句中的值(如果return语句没有指定值(空的),则返回undefined)并停止函数运行,哪怕return语句之后还有语句。如果一个函数没有return语句,则它的返回值是undefined。

function fn ( ){
  return 10;
  console.log ('永远不会见到我');
}
var a=fn( );
console.log( a ); //10

在函数中声明的变量叫局部变量,这样的变量只在函数中可见,也只能用在函数中(局部作用域),函数返回,局部变量也就消失了,也就是说局部变量的生命周期等同于函数的声明周期。(闭包可以延长函数的生命周期,这是后面的内容)

在函数中使用没有声明的变量,会静默的创建全局变量(严格模式下会返回错误,这本书没有讲严格模式),千万别这么做。、

全局变量就是在整个程序中随处可用的变量,除非被屏蔽,也就是说局部变量使用了与全局变量相同的变量名,那么在这个局部作用域中,全局变量是不可见的。

在一个网页中只有一个全局作用域,也就是说不同的js文件共享同一个全局作用域,因此应该尽量减少使用全局作用域。

函数声明可以放在网页的任何位置,甚至在调用它之后,因为函数声明会被提升。

本章最后给出了一些编码建议: 1)在程序开头声明全局变量。 2)把函数声明放在一块儿,无论是开头或者结尾。 3)在函数开头声明局部变量。