函数是根基

理解函数为什么如此重要

JavaScript 是一门 函数式语言

函数为什么是第一型对象

在 JavaScript 中,函数可以共处,可以将其视为其他任意类型的 JavaScript 对象而进行使用,除此之外,函数还有一个特殊的功能,它们可以 被调用(通常以 异步方式 进行调用)。

对象在 JavaScript 中有如下功能:

  • 它们可以通过字面量创建。
  • 它们可以赋值给变量、数组或其他对象的属性。
  • 它们可以作为参数传递。
  • 它们可以作为函数的返回值进行返回。
  • 它们拥有动态创建并赋值的属性。

浏览器如何调用函数

  1. 我们为浏览器中发生的各种事件建立事件处理程序,这些事件在触发时被放置在一个事件队列中(先进先出列表[FIFO]);

  2. 浏览器负责事件轮询和事件派发,从而调用我们事先建立好的事件处理程序。

注意:

  • 浏览器的事件轮询是 单线程 的。每个事件都是按照在队列中所放置的顺序来处理的。
  • 浏览器把事件放到队列上的机制是在事件轮询模型之外。确定事件何时发生并把它们放到事件队列上的过程所处的线程,并不参与事件本身的处理。

回调:我们定义一个函数,以便其他一些代码在适当的时机回头再调用它。

函数声明

JavaScript 函数是使用 函数字面量 进行声明从而创建函数值的。

函数字面量由四个部分组成:

  1. function 关键字
  1. 可选名称,如果指定名称,则必须是一个有效的 javaScript 标识符;
  1. 括号内部,一个以逗号分隔的参数列表。(有效的标识符,参数列表允许为空,圆括号必须始终存在);
  1. 函数体,包含在大括号内的一系列 JavaScript 语句。(函数体可以为空,但大括号必须始终存在)。

命名一个函数时,该名称在整个函数声明范围内是有效的。此外,如果一个命名函数声明在顶层,window 对象上的同名属性则会引用到该函数。

所有的函数都有一个 name 属性,该属性保存的是该函数名称的字符串。没有名称的函数也仍然有 name 属性,只是该属性值为空字符串罢了。

作用域和函数

  • 变量声明的作用域开始于声明的地方,结束于所在函数的结尾,与代码嵌套无关。
  • 命名函数的作用域是指声明该函数的整个函数范围,与代码嵌套无关。(有些人称之为 机制提升。)
  • 对于作用域声明,全局上下文就像一个包含页面所有代码的超大型函数。

函数可以在其作用域范围内提前被引用,而变量不行。

参数赋值之谜

函数调用的四种方式:

  • 作为一个函数 进行调用(最简单形式);
  • 作为一个方法 进行调用,在对象上进行调用,支持面向对象编程;
  • 作为构造器 进行调用,创建一个新对象;
  • 通过 apply() 或 call() 方法 进行调用(较复杂)。

从参数到函数形参

  • 如果实际传递的参数大于函数声明的形参数量,超出的参数则不会配给形参名称;

  • 如果声明的形参数量大于实际传递的参数数量,则没有对应参数的形参会赋值为 undefined

所有的函数调用都会传递两个隐式参数argumentsthis

所谓 隐式 : 意味着这些参数不会显示列在函数签名里,而会默默地传递给函数并存在于函数作用域内。在函数内部,可以像其他显示命名的参数一样使用。

arguments 参数

传递给函数的所有参数的一个集合,有 length 属性。只是一个类数组结构,并且只拥有数组的某些特性。

this 参数

this 参数引用了与该函数进行隐式关联的一个对象,被称之为 函数上下文

JavaScript 中的 this 依赖于函数的调用方式,可以称为 调用上下文

(1)作为函数进行调用:

  • 此时,函数的上下文是全局上下文——window对象,并没有把函数作为对象的一个属性,通常被认为是自己的机制。

(2)作为对象的方法进行调用:

  • 此时,该对象就变成了函数上下文,并且在函数内部可以以 this 参数的形式进行访问。

  • 与“作为函数”进行调用对比:除了“作为函数”进行调用是定义在 window 上的,而且调用的时候不必再需要 window 的一个引用了。其它是一样的,函数“属于” window,window 则作为函数上下文,和对象 o 作为函数上下文是一样的道理。

(3)作为构造器进行调用:

  • 此时,要在函数调用前使用 new 关键字。

构造器的超能力:

  • 创建一个新的空对象;
  • 传递给构造器的对象是 this 参数,从而成为构造器的函数上下文;
  • 如果没有显式的返回值,新创建的对象则作为构造器的返回值进行返回。

构造器的目的 : 要创建一个新对象并对其进行设置,然后将其作为构造器的返回值进行返回。

至此,我们看到,函数调用方式之间的 主要差异 是:作为 this 参数传递给执行函数的上下文对象之间的区别。作为方法进行调用,该上下文是方法的拥有者;作为全局函数进行调用,其上下文永远是 window(也就是说,该函数是 window 的一个方法);作为构造器进行调用,其上下文对象则是新创建的对象实例。

(4)使用 apply() 或 call() 方法进行调用:

  • 在函数调用时,可以显式指定任何一个对象作为其函数上下文。

  • 实际使用时,选择最能匹配参数的那个方法。

函数上下文

  • 函数是程序的构建块而不是命令式语句。

可以用不同的方法进行函数调用,不同的调用机制决定了函数上下文的不同。

作为普通函数进行调用时,其上下文是全局对象(window)。

作为方法进行调用时,其上下文是拥有该对象的方法。

作为构造器进行调用时,其上下文是一个新分配的对象。

通过函数的 apply() 或 call() 方法进行调用时,上下文可以设置成任意值。

《JavaScript Ninja》之函数是根基的更多相关文章

  1. 读Secrets of the JavaScript Ninja(一)函数

    理解JavaScript为什么应该作为函数式 在JavaScript中,函数是程序执行过程中的主要模块单元 函数是第一类对象 通过字面量创建 function ninjaFunction(){} 赋值 ...

  2. 《Secrets of the JavaScript Ninja》:JavaScript 之运行时代码

    最近,在阅读 jQuery 之父 John Resig 力作:Secrets of the JavaScript Ninja(JavaScript忍者秘籍).关于第九章提及的 JavaScript 之 ...

  3. 深入理解JavaScript中的函数操作——《JavaScript忍者秘籍》总结

    匿名函数 对于什么是匿名函数,这里就不做过多介绍了.我们需要知道的是,对于JavaScript而言,匿名函数是一个很重要且具有逻辑性的特性.通常,匿名函数的使用情况是:创建一个供以后使用的函数.简单的 ...

  4. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  5. 用javascript 写个函数返回一个页面里共使用了多少种HTML 标签

    今天我无意间看到一个面试题: 如何用javascript 写个函数返回一个页面里共使用了多少种HTML 标签? 不知你看到 是否蒙B了,如果是我 面试,肯定脑子嗡嗡的响.... 网上搜了搜也没有找到答 ...

  6. JavaScript基础学习-函数及作用域

    函数和作用域是JavaScript的重要组成部分,我们在使用JavaScript编写程序的过程中经常要用到这两部分内容,作为初学者,我经常有困惑,借助写此博文来巩固下之前学习的内容. (一)JavaS ...

  7. JavaScript 基础回顾——函数

    在JavaScript中,函数也是一种数据类型,属于 function 类型,所以使用Function关键字标识函数名.函数可以在大括号内编写代码并且被调用,作为其他函数的参数或者对象的属性值. 1. ...

  8. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  9. javascript立即执行函数

    javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花;当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解.  ( ...

随机推荐

  1. Visual Studio 2012中的为创建类时的添加注释模板

    我们往往需要给类添加注释,我们可以把注释块复制出来,放到文件中,然后在需要的时候,复制.粘贴.这样的重复劳动增加了程序员的体力劳动,而VS中给我们提供了项模版,我们只需要在其中修改一点点模版就能达到这 ...

  2. pandas进行数据分析需要的一些操作

    一.查看数据 1.查看DataFrame前xx行或后xx行a=DataFrame(data);a.head(6)表示显示前6行数据,若head()中不带参数则会显示全部数据.a.tail(6)表示显示 ...

  3. 枚举IoTimer

    /*************************************************************************************** * AUTHOR : ...

  4. [Js]基础知识

    一.JavaScript组成 1.ECMAScript 解释器.翻译(提供功能有限,如加减乘除,定义变量.函数等)   几乎没有兼容性问题 2.DOM    有一些兼容性问题 3.BOM(用的少,交互 ...

  5. 在虚拟机上安装Ubutu完成后卡在VM Tool的安装上

    今天在虚拟机上装Ubuntu之后,卡在了VM Tool的安装页,点击回车后可以进入命令行模式.并出现如下提示“Vmware Easy Install PLEASE WAIT! VMware Tools ...

  6. MySql插入记录时判断

    我们在开发数据库相关的逻辑过程中, 经常检查表中是否已经存在这样的一条记录, 如果存在则更新或者不做操作, 如果没有存在记录,则需要插入一条新的记录. 这样的逻辑固然可以通过两条sql语句完成. SE ...

  7. soap

    sudo apt-get update apt-get install php-soapphp-config --configure-options --enable-soap php -i | gr ...

  8. node cheerio

    所谓工欲善其事,必先利其器,所以通读了cheerio的API,顺便翻译了一遍,有些地方因为知道的比较少,不知道什么意思,保留了英文,希望各位不吝告诉我,然后一起把这个翻译完成. ###cheerio ...

  9. java基础之 反射

    首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...

  10. T420修改wifi灯闪动模式

    给T420新装了centos7发现默认的配置wifi灯是工作时闪动的,有点晃眼,想改成简单的on 的时候常亮,off的时候常暗的模式 添加配置文件: vi /etc/modprobe.d/wlanle ...