JavaScript高级程序设计(第3版)学习笔记8 js函数(中)

yizhihongxing

JavaScript高级程序设计(第3版)学习笔记8 js函数(中)主要围绕函数作用域、闭包、函数式编程和函数对象四大主题展开,下面分别做详细说明:

函数作用域

JavaScript中的函数作用域是通过函数定义时的位置来决定的,即内部函数可以访问外部函数中的变量和函数,而外部函数无法访问内部函数中的变量。通过这种作用域链的形式来维护作用域,每个函数被创建时都会自动创建一个内部属性Scope,其中保存了当前的作用域链。该作用域链是一个指针列表,每个指针指向一个变量对象(VO)或者全局对象(GO),作为当前代码的可执行环境。而函数中定义的变量会保存在函数执行环境(Activation Object)中。函数执行完毕后,它的执行环境会被销毁,内部定义的变量也就随之消失。

闭包

闭包是指有权访问另外一个函数作用域中的变量的函数,即使这个函数已经被执行完毕,也仍然可以使用其中的变量。闭包的实现方式是在外部函数中定义内部函数,并且内部函数中可以使用外部函数中的变量,从而形成一个闭包。在编程中,闭包常常用于封装变量和对象,以防止全局命名冲突,另外还可以用于事件处理器和回调函数等场景中使用。

下面是一个使用闭包实现计数器的示例:

function counter() {
  var count = 0;
  return function() {
    return ++count;
  };
}

var c1 = counter();
console.log(c1()); // 1
console.log(c1()); // 2

函数式编程

函数式编程(Functional Programming)是一种基于数学函数的编程风格,它强调使用纯函数(Pure Function)、函数组合和函数传递等概念。纯函数指的是输入相同的参数时,总是返回相同的结果,不会对外部环境产生任何副作用的函数。函数组合指的是将多个函数结合在一起,构成一个更加复杂的函数。而函数传递则是指将一个函数作为参数,传递给另外一个函数。

在JavaScript中,函数式编程可以借助于函数的高阶特性实现。常用的高阶函数包括map()、reduce()和filter()等。map()函数可以将一个数组映射成另外一个数组,reduce()函数可以将一个数组合并成一个值,filter()函数可以对一个数组进行筛选。

下面是一个使用map()和reduce()实现计算平均值的示例:

var numbers = [1, 2, 3, 4, 5];

var sum = numbers.reduce(function(prev, cur) {
  return prev + cur;
});

var avg = sum / numbers.length;

console.log(avg); // 3

函数对象

JavaScript中的函数也是一种对象(Function Object),它具有方法和属性。常用的函数对象方法包括call()、apply()和bind()等,这些方法都可以用来改变this关键字的指向,从而达到使用不同对象调用同一个函数的目的。

下面是一个使用call()方法实现继承的示例:

function Animal(name) {
  this.name = name;
}

Animal.prototype.sayName = function() {
  console.log(this.name);
};

function Dog(name, age) {
  Animal.call(this, name);
  this.age = age;
}

var dog = new Dog("旺财", 3);

dog.sayName(); // 报错,因为Dog没有继承Animal的原型

// 结合使用call()和Object.create()方法来实现继承
Dog.prototype = Object.create(Animal.prototype, {
  constructor: {
    value: Dog,
    enumerable: false,
    writable: true,
    configurable: true
  }
});

dog.sayName(); // 旺财

以上是JavaScript高级程序设计(第3版)学习笔记8 js函数(中)的完整攻略,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript高级程序设计(第3版)学习笔记8 js函数(中) - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • javascript Error 对象 错误处理

    下面是关于“JavaScript Error 对象错误处理”的完整攻略: 定义 JavaScript Error 对象是一个构造函数,用于创建表示错误情况的对象。 Error 对象可以在发生异常、错误或任何其他意外情况时使用,从而方便地对错误进行处理和调试。 创建一个 Error 对象 我们可以使用 new 关键字创建一个 Error 对象,如下所示: le…

    JavaScript 2023年6月10日
    00
  • npm scripts 使用指南详解

    首先介绍一下npm scripts,它是一个在执行npm命令时可以运行的脚本。我们可以通过定义不同的脚本来完成一些常规的任务,例如编译,测试,打包等。 如何定义npm scripts npm scripts 的定义需要在 package.json 文件中进行。在 package.json 文件中,可以使用 “scripts” 字段来定义脚本。例如,我们可以在…

    JavaScript 2023年5月27日
    00
  • 详解Angular中通过$location获取地址栏的参数

    以下是详解Angular中通过$location获取地址栏的参数的完整攻略: 1. 简介 在Angular中,我们可以通过使用$location服务获取地址栏中的URL信息,包括协议、域名、路径和查询参数等。$location是Angular中的一个内置服务,在跟踪URL和路由变化方面非常有用。 2. 使用示例 示例1:获取查询参数 我们首先创建一个控制器,…

    JavaScript 2023年6月11日
    00
  • 验证用户必选CheckBox控件与自定义验证javascript代码

    验证用户必选CheckBox控件与自定义验证javascript代码是网站开发过程中一个很重要的环节,可以有效地提高网站的安全性和用户体验。本文将详细讲解该过程的完整攻略。 一、HTML中定义CheckBox控件 在HTML页面中,我们可以使用<input type=”checkbox”>标签来定义一个CheckBox控件。要实现用户必选的功能,…

    JavaScript 2023年6月10日
    00
  • Javascript & DHTML上传文件控件

    下面是关于JavaScript & DHTML上传文件控件的完整攻略: 一、什么是JavaScript & DHTML上传文件控件 JavaScript & DHTML上传文件控件是一种用于在网页中实现上传文件功能的控件,通过该控件可以让用户在不离开网页的情况下上传本地文件到服务器。 二、如何使用JavaScript & DH…

    JavaScript 2023年5月27日
    00
  • Javascript调试脚本的经验之谈第2/2页

    下面是关于“JavaScript调试脚本的经验之谈”的完整攻略。 第一步:使用控制台 控制台是JavaScript调试中最重要的工具之一。可以通过在控制台中打印信息、执行代码、查看对象属性等方式来找到代码问题。 在控制台中可以使用以下方法进行调试: 1. console.log()方法 console.log()方法是JavaScript中使用最广泛的输出调…

    JavaScript 2023年6月1日
    00
  • JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端

    在JS中使用mailto协议可以实现将用户输入的内容传递到本地邮件客户端。mailto协议是一种特殊的URL协议,使用具有mailto之前缀的超链接或javascript中的window.location.href等方法可以触发邮件客户端的启动。 以下是实现将用户在网页中输入的内容传递到本地邮件客户端的完整攻略: 1.编写HTML代码 首先,需要在HTML中…

    JavaScript 2023年5月19日
    00
  • 详解在Javascript中进行面向切面编程

    下面我将详细讲解在Javascript中进行面向切面编程的完整攻略。 什么是面向切面编程 在介绍如何在Javascript中进行面向切面编程之前,我们先来了解一下什么是面向切面编程(Aspect-Oriented Programming,简称AOP)。 AOP是一种编程思想,它可以对横跨多个模块的代码进行集中式管理。在AOP中,我们可以通过切面来描述一个横跨…

    JavaScript 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部