js函数的声明

函数是一段可以反复调用的代码块。

JavaScript声明一个函数可用两种方法。

第一种方法使用function命令。function命令后面是函数名,函数名后面是一对圆括号,里面是传入函数的参数。函数体放在大括号里面,大括号后面不用加分号。

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

上面的代码命名了一个print函数,以后使用print()这种形式,就可以调用相应的代码。

第二种采用变量赋值的写法。

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

这种写法将一个匿名函数赋值给变量。匿名函数又称函数表达式,因为赋值语句的等号右侧只能放表达式。采用函数表达式声明函数时,function命令后面不带有函数名,需要在语句的结尾加上分号,表示语句结束。

js函数的调用

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

函数体内部的return语句,表示返回,直接返回后面的表达式的值,即使return语句后还有其他语句,也不会得到执行。

return语句不是必需的,如果没有的话,该函数就不返回任何值,或者说返回undefined。

可以把函数赋值给变量和对象的属性,也可以当作参数传入其他函数,或者作为函数的结果返回。

根据ECMAScript的规范,不得在非函数的代码块中声明函数,最常见的情况就是if和try语句。

函数的name属性返回紧跟在function关键字之后的那个函数名。length属性返回函数预期传入的参数个数,即函数定义之中的参数个数。函数的toString方法返回函数的源码。

js函数作用域

作用域是指变量存在的范围。

Javascript只有两种作用域:

一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;

另一种是函数作用域,变量只在函数内部存在。

在函数外部声明的变量称为全局变量,它可以在函数内部读取。在函数内部定义的变量,外部无法读取,称为局部变量。函数内部定义的变量,会在该作用域内覆盖同名全局变量。

注意,对于var命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量。

if (true)
{
  var x = 5;
}
console.log(x);  // 5

上面代码中,虽然变量x在条件判断区块之中声明,但仍然是一个全局变量,可以在区块之外读取。

函数作用域内部用var命令声明的变量,不管在什么位置,变量声明都会被提升到函数体的头部。

函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。

'use strict';
var a=100;
function m( )
{
    return a;  
}
function n( )
{
    var a='abc';
    return m( );
}
console.log('a='+m( ));//a=100
console.log('a='+n( ));//a=100

函数体内部声明的函数,作用域绑定函数体内部。如下代码中,函数A内部声明了一个函数f,f的作用域绑定A。当在A外部取出f执行时,变量a指向的是A内部的a,而不是A外部的a。

'use strict';
var a="外部变量";
function A( )
{
内部变量";
    function f()
    {
      return "a="+a;
    }
    return f;
}
var foo=A( );
console.log( foo( ) ); //a=内部变量

js函数的参数

函数运行时提供的外部数据叫参数,Javascript允许省略参数。

如果函数参数是数值、字符串、布尔值,那么传递方式是传值传递,在函数体内修改参数值,不会影响到函数外部。

如果函数参数是数组、对象、其他函数),那么传递方式是传址传递,在函数内部修改参数,将会影响到原始值。

函数内部的arguments对象包含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。arguments对象的length属性可以判断函数调用时到底带几个参数。严格模式下,arguments对象是一个只读对象,修改它是无效的,但不会报错。

'use strict';
var f = function(one)
{
  console.log(f.length);//1
  console.log(arguments.length);//2
  console.log(arguments[0]);//1
  console.log(arguments[1]);//2
  console.log(arguments[2]);//undefined
}
f(1, 2);