JavaScript-->Function类型

Function类型

函数实际上是对象,每个函数都是 Function 类型的实例,函数名实际上也是一个指向函数对象的指针。

2.5.1 函数声明

有两种方式:函数声明函数表达式

function sum(num1, num2) {
  return num1 + num2;
}

var sum = function(num1, num2) {
  return num1 + num2;
}

PS1: 这两种方式效果是一样的,但解析器会率先读取函数声明,并在其执行代码之前可用;而函数表达式必须等到解析器执行到它所在的代码行,才会真正被解释执行。

PS2: 如果声明了两个同名函数,则后面的覆盖前面的。

2.5.2 函数内部属性

在函数内部,有两个特殊的对象:argumentsthis。其中前者是一个类数组对象,包含这传入函数中的所有参数;后者引用的是函数执行的环境对象。

arguments 对象还有一个 callee 属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。可以利用这个属性写一个经典的阶乘函数

function factorial(num) {
  if (num <= 1) {
    return 1;
  } else {
    return num * arguments.callee(num - 1);
    //return num * factorial(num - 1);
  }
}
console.log(factorial(5));          //120

函数中的 this 代表函数执行的环境

var color = 'red';
function sayColor() {
  alert(this.color);
}
sayColor();                         //red

2.5.3 函数属性和方法

每个函数都包含两个属性:lengthprototype

length 属性表示函数希望接收的命名参数的个数

function sayName(name) {
  alert(this.name);
}

function sun(num1, num2) {
  return num1 + num2;
}

alert(sayName.length);              //1
alert(sun.length);                  //2

在 ECMAScript 核心所定义的全部属性中,最耐人寻味的就是 prototype 了。对于引用类型而言,prototype 是保存他们所有实例方法的真正所在。在创建自定义引用类型以及实现继承时,这个属性是及其重要的。

每个函数都有两个方法:apply()call(),用途都是在特定的作用域中调用函数(实际上等于设置函数体内 this 对象的值)。他们的区别仅仅在于接收参数的方式不同。

function sun(num1, num2) {
  return num1 + num2;
}

function callSum(num1 + num2) {
  return sum.apply(this, arguments);
  //return sun.call(this, num1, num2);
}

上面这个用法并不是他们真正的用武之地

var color = 'red';
var color = 'red';
var o = { color: 'blue' };
function sayColor() {
  alert(this.color);
}

sayColor();                  //red
sayColor.call(o);            //blue

 上一篇
JavaScript-->正则表达式 JavaScript-->正则表达式
RegExp类型ECMAScript 通过 RegExp 类型来支持正则表达式。 创建正则表达式正则表达式的形式如:/pattern/flags,pattern 称为模式,可以是任何简单或复杂的正则表达式;flags 是匹配模式,每个正则表
2018-10-30
下一篇 
Java面向对象设计之单例模式 Java面向对象设计之单例模式
模式动机对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。 如何保证一个类只有一个实例并且
2018-10-29
  目录