第四章 函数

函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。

函数对象

JavaScript中的函数就是对象。对象是“名/值”对的集合并拥有一个连接到原型对象的隐藏链接。对象字面量产生的对象连接到Object.prototype。函数对象连接到Function.prototype(该原型对象本身连接到Object.prototype)。每个函数在创建时会附加两个隐藏属性:函数的上下文和实现函数行为的代码。创建一个函数时,会给该对象设置一个“调用”属性。当JavaScript调用一个函数时,可理解为调用此函数的“调用”属性。

每个函数对象在创建时,都会有有一个prototype属性。其中存在一个constructor 属性,constructor始终指向创建当前对象实例的(构造)函数。任何函数都是一个Function类的实例,所以任何函数的constructor属性都指向Function类,而Function类的constructor属性则指向了它本身。

函数可以想其它对象一样保存在变量、对象和数组中。也可以当作参数传递给其它函数,函数也可以再返回函数。

函数字面量

函数对象通过函数字面量来创建:


函数字面量包括四个部分:

1.保留字 function    

2.函数名,可以被省略,如果没有命名,则称之为匿名函数。函数可以通过调用自己的名字来递归的调用自己。

3.是包围在圆括号中的一组参数,多个参数用逗号分隔开来。这些参数将被定义为函数中的变量,在函数被调用时初始化为实际提供参数的值。

4.是包围在花括号中的一组参数。这些语句是函数的主题,在函数被调用时执行。

调用

调用一个函数会暂停当前的执行,传递控制权和参数给新函数。除了声明定义的形式参数外,每个函数还接收两个附加参数:this 和 arguments 。参数 this 的值取决于调用的模式

在JavaScript中一共有四种调用模式:方法调用模式函数调用模式构造器调用模式apply调用模式。

函数声明时会定义一个或多个由逗号隔开的形式参数,当调用函数时,实际传递给的实际参数与函数声明时定义的形式参数的个数不匹配时,不会导致运行时错误。如果实际参数过多了,超出的参数会被忽略。如果实际参数过少,缺失的值会被替换为undefined,任何类型的值都可以被传递给任何参数。

方法调用模式

当一个函数被保存为对象的一个属性是,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。如果调用表达式通过 . 表达式或者 [ ] 表达式调用,那么它就是被当作一个方法来调用。


方法可以使用this访问自己所属的对象,能够进行取值和修改。通过this取得所属对象的上下文方法称为公共方法。

函数调用模式

当一个函数并非一个对象的属性时,那么它就是被当作一个函数来调用。


函数调用模式

以此模式调用函数时,this被绑定到全局对象(window),内部无法通过this访问对象的值,可以通过定义一个变量将this赋值给它,那么内部函数就可以通过那个变量访问到this。


this作用域

构造器调用模式

JavaScript是一门基于原型继承的语言,所以对象可以直接从其它对象继承属性。  

如果在一个函数前面加上 new 来调用,那么背地里就会创建一个连接到该函数的Prototype成员的对象,同时 this 会被绑定到新对象上。 


构造器函数

一个函数如果创建的目的就是希望结合 new 前缀来调用,那么它被陈伟构造器函数。按照约定它保存在以大写格式命名的变量里。

Apply调用函数

函数拥有方法。其中 apply 方法可以调用一个对象的一个方法,用另一个对象替换当前对象。它接收两个参数,第一个是要绑定给 this 的值,第二个就是一个参数数组。

例如: A.apply ( B,arguments); B对象调用A对象的方法


apply()方法

参数

当函数被调用时,会得到一个arguments数组参数。函数可以通过此参数访问它被调用时传递给它的所有参数,包括函数声明时定义的形式参数的多余参数。但是arguments并不是一个和真正的数组,它只是一个类似数组的对象,它拥有length属性,但是没有任何数组的方法。


arguments参数

返回

当一个函数被调用时,它从第一个语句执行,并在遇到关闭函数体的 } 时结束。然后函数把控制权交还给调用该函数的程序。

return 可以使函数提前返回。当 return 被执行时,函数立即返回不再执行余下的语句。一个函数总会返回一个值,如果没有执行返回值,则返回 undefined。如果在函数调用时前面加上了 new 前缀,且返回值不是一个对象,则返回 this (该新对象)。

扩充类型的功能

可以通过给函数的原型对象Function.prototype 自定义添加一个method方法(对所有函数可用),当其它基本类型调用这个方法时,this绑定到该对象,根据传参为该对象添加一个方法。


添加方法

递归

递归函数就是直接或者间接地调用自身的一种函数。它把一个问题分解为一组相似的子问题,用一般的方式去解决每个子问题。一般来说,一个递归函数调用自身去解决它的子问题。

模块

模块是一个提供接口却隐藏状态与实现的函数或者对象,可以使用函数和闭包来构造模块。

模块的一般形式是:一个定义了私有变量和函数的函数。利用闭包创建可以访问私有变量和函数的特权函数。最后返回这个特权函数,或者把它保存到一个可访问的地方。


模块
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 10,180评论 0 5
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 10,717评论 0 21
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,771评论 0 4
  • 函数 JS设计得最出色的就是它的函数的实现。它几乎接近完美。但是,想必你也能预料到,JS的函数也存在瑕疵。所谓编程...
    __越过山丘__阅读 1,445评论 0 0
  • 文/二姑娘 01 从读初中开始,我的母校就在不断给我们灌输一个理念:书要好好读,以后才能考上一个好大学,考上一个好...
    二姑娘儿阅读 4,106评论 2 6

友情链接更多精彩内容