5.5 Function类型

函数实质上是对象, 每个函数都是Function类型的实例, 并且都和其他引用类型一样具有属性和方法.

因此函数名实际上也是一个指向函数对象的指针, 不会与某个函数绑定.

三种函数定义方法:

  1. 函数声明:

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

  2. 函数表达式:

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

  3. 使用Function构造函数

var sum = new Function("num1", "num2", "return num1 + num2");   //不推荐

  

5.5.1 没有重载

5.5.2 函数声明与函数表达式

解析器会率先读取函数声明. 并使其在执行任何代码之前可用; 但对函数表达式, 则必须等到解析器执行到它所在的代码行,才会真正解释执行.

5.5.3 作为值的函数

5.5.4 函数内部属性

1) arguments

  • 属性callee: 一个指针,指向拥有这个arguments对象的函数. 其实就是指向当前函数呗
  • //举个例子: 一个阶乘函数
    function factorial(num){
    if(num <= 1 ){
    return 1;
    } else {
    return num * factorial(num-1);
    }
    }
    //这个函数的执行与函数名紧耦合, 为了消除这种紧耦合,使用arguments.callee
    function factorial(num){
    if(num <= 1){
    return 1;
    } else {
    return num * arguments.callee(num-1);
    }
    }
    //这个重写后的factorial()函数的函数体内,没有再引用函数名. 这样,无论引用函数时使用什么名字,都可保证正常完成递归调用.
  • 对象this: 引用的是函数据以执行的环境对象-----当在网页的全局作用域中调用函数时,this对象引用的就是window

  • ECMAScript 5 规范化了另一个函数对象的属性: caller. 这个属性中保存着调用当前函数的函数的引用, 如果是全局作用域中调用当前函数,它的值为null
    • function outer(){
      inner();
      }
      function inner(){
      alert(arguments.callee.caller); //arguments.callee == inner
      }
      outer(); //会显示outer()函数的源代码

严格模式下:

  访问arguments.callee会导致错误.

  ECMAScript 5 还定义了arguments.caller属性, 但在严格模式下访问它也会导致错误, 而在非严格模式下这个属性始终是undefined. 定义这个属性是为了分清arguments.caller和函数的caller属性

  不能为函数的caller属性赋值, 否则会导致错误

5.5.5 函数属性和方法

  • 每个函数都包含两个属性: length 和 prototype.

    • 其中, length属性表示函数希望接收的命名参数的个数
  • 每个函数都包含两个非继承而来的方法: apply 和 call
    • 两个方法都是用于在特定的作用域中调用函数,实际上等于设置函数体内this对象的值.
    • apply方法接收两个参数,一个是在其中运行函数的作用域, 另一个是参数数组. 参数数组可以是Array的实例, 也可以是arguments对象
    • 对call方法而言, 第一个参数是this值没变,第二个参数是其余参数都直接传递给函数. 即传递给函数的参数必须逐个列举出来
    • 使用call和apply方法来扩充作用域
      • 好处: 对象不需要与方法有任何耦合关系
  • ECMAScript 5 还定义了一个方法: bind(). 这个方法会创建一个函数的实例, 其this值会被绑定到传给bind()函数的值.
    • window.color = "red";
      var o = { color: "blue"}; function sayColor(){
      alert(this.color);
      }
      var objectSayColor = sayColor.bind(o);
      objectSayColor(); //blue
  • 每个函数继承的toLocaleString()和toString()方法始终都返回函数的代码.
  • 另一个继承的valueOf()方法也同样只返回函数代码

《JavaScript高级程序设计》5.5 Function类型的更多相关文章

  1. 引用类型-Function类型

    Function类型 定义函数的三种方式: 1.函数声明 function sum(num1,num2){ return num1 +num2; } 2.函数表达式 var sum = functio ...

  2. 【笔记】js Function类型 内部方法callee

    运用function实现阶乘 以往的做法是如下的 function factorial(num){ if(num <= 1){ return 1; }else{ return num * fac ...

  3. Function类型

    1.每个函数都是Function类型的,和其他引用类型一样都具有属性和方法.函数也是对象,因此函数实际上是一个指向函数对象的指针. 函数声明语法定义: 方法1: function sum(num1,n ...

  4. JavaScript笔记——引用类型之Object类型和Function类型

    <JavaScript高级程序设计>中介绍的几种JavaScript的引用类型,本文只记了Object跟Function类型 Object类型 创建对象 var person = new ...

  5. String类型,Function类型

    1.String类型:  1)创建String对象:    var str=new String(s);    String(s);    参数:参数 s 是要存储在 String 对象中的值或转换成 ...

  6. JavaScript高级 Function类型

    ·    Function类型 (属于引用类型) 1.JS中,有的函数均是对象,这个一个非常有特点的地方.它既然是对象,那么它的构造函数是谁呢?就是Function.(例如:function Pers ...

  7. 浅析JavaScript之Function类型

    JavaScript中的函数实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上只是指向函数对象的指针,保存函数在堆内存中的地 ...

  8. 笔记——Function类型 及其 call、apply方法

    每个函数都是Function类型的实例.函数有三种定义方式和两个内部属性arguments和this. 同时函数也是对象,也有属性和方法.本篇主要其call()和apply()方法 属性 length ...

  9. 引用类型之Function类型

    Function类型 ECMAScript中最有意思的就是函数了,有意思的根源,在于函数实际上是对象.每个函数都是Function的实例,具有属性和方法.而重要的一点是,函数名,不过是指向函数的指针, ...

  10. 第十一章 Function类型

    在ECMAScript中,Function(函数)类型实际上是对象.每个函数也是Function类型的实例,而且都与其它引用类型一样具有属性和方法.由于是函数对象,因此函数名实际上也是一个指向函数对象 ...

随机推荐

  1. 215. Kth Largest Element in an Array(QuickSort)

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  2. [leetcode]283. Move Zeroes移零

    Given an array nums, write a function to move all 0's to the end of it while maintaining the relativ ...

  3. php 使用PHPExcel 导出数据为Excel

    <?php require_once 'PHPExcel/Classes/PHPExcel.php'; /** * 导出数据为Excel * @param array $fieldArr 标题数 ...

  4. 将对象转为json,加入到HttpResponseMessage中

    需要引用程序集: System.Net.Http System.Web System.Web.Extensions Code: using System; using System.Collectio ...

  5. OpenGL.ProjectiveTextureMapping

    1. 简介 https://developer.nvidia.com/content/projective-texture-mapping

  6. python创建独立虚拟工作环境方法

    前言: python的组件非常之多,有时这个项目依赖m个组件,有时那个项目依赖n个组件,时间一长很容易导致系统python环境的臃肿不堪,由此便有了virtualenv.virtualenvwrapp ...

  7. 品味性能之道<七>:索引基础

    一.索引概述      索引(index),它是数据库必不可少的一部分.它其实很简单呐!很好理解.      索引好比如一本书的目录,一张地图,一个写字楼里挂在大堂墙上的公司名录,一个地铁站的出口指示 ...

  8. [BAT]批处理自动修改区域和语言选项

    open a cmd window and type reg query "HKCU\Control Panel\International" which will show yo ...

  9. spring 3 mvc 的 @ResponseBody返回数据中文乱码

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter&q ...

  10. part1:3-VMware及redhat enterprise Linux 6 的安装

    创建虚拟机PC FILE->NEW Virtual machine->custom(自定义,定制)->...->I WILL INSTALL THE OS LATER-> ...