6

定义函数

方法一:函数声明

函数声明要素:function关键字,functionName函数名,arg参数(可选)

  • 语法

function functionName(arg){
    //函数体
}
  • 示例

function square(number) {
  return number * number;
}

var a = 2;

square(a); //4
  • 需要注意的地方:

当函数的参数是一个值(比如上面的例子),
若被调用函数改变了这个参数的值,这样的改变不会影响到全局或调用的函数。

但当函数的参数是一个对象(即一个非原始值,例如Array或用户自定义的其它对象),
若函数改变了这个对象的属性,这样的改变对函数外部是可见的。

function myFunc(theObject) {
  theObject.make = "Toyota";
}

var mycar = {make: "Honda", model: "Accord", year: 1998},
var x, y;

x = mycar.make;     // x 获取的值为 "Honda"【原本】

myFunc(mycar);
y = mycar.make;     // y 获取的值为 "Toyota"【现在】(make属性的值在函数中被改变了)

方法二:函数表达式

函数表达式要素:var关键字,variableName变量名,表达式赋值等号,声明变量后的分号,
functionName函数名(可选,没有的话叫做匿名函数)

  • 语法

var variableName = function functionName(arg){
    //函数体
};
  • 示例1(匿名函数)

var square = function(number) {
  return number * number;
};
var x = square(4); // x 得到的值为16
  • 示例2(函数表达式也可以提供函数名,并且可以用于在函数内部使用来代指其本身,或者在调试器堆栈跟踪中鉴别该函数)

var factorial = function fac(n) {return n<2 ? 1 : n*fac(n-1)};

console.log(factorial(3));
var x = square(4); // x 得到的值为16
  • 需要注意的地方:
    使用Function构造函数也可以定义函数,不过因为性能问题不推荐使用,在此仅作了解就好

    • 语法

          var variableName = new Function("arg0","arg1","函数体");
          //函数是对象,函数名是指针,一个函数可能会有多个名字~~
          //当一个对象的属性是函数时,其称之为方法。

函数声明和函数表达式的区别

虽然都可以定义函数,但最大的区别在于:
解析器会率先读取函数声明,使其在执行任何代码之前就可以访问(也就是 函数声明提升);
而函数表达式则需要解析器执行到它所在的代码行才会被解释执行。

sayHi();//能正常运行 弹Hi
sayHi123();//报错 Uncaught TypeError: sayHi123 is not a function(…)

function sayHi(){
    alert('Hi');
}

var sayHi123 = function sayHi(){
    alert('Hi123');
};

幸运儿
916 声望139 粉丝