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

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日

相关文章

  • 结合 ES6 类编写JavaScript 创建型模式

    结合 ES6 类编写JavaScript 创建型模式的步骤: 定义一个类,这个类代表要创建的对象类型。 在类中定义一个静态方法,这个静态方法将使用类的构造函数来创建一个对象。 定义一个方法,用于对类的实例进行初始化。这个方法通常是一个构造函数或者一个工厂方法。 对类进行扩展,以便可以创建新的对象类型。 实例化新的对象。 下面简单介绍两种在 ES6 中创建 J…

    JavaScript 2023年6月10日
    00
  • ajax获取json数据为undefined原因分析

    当我们使用AJAX获取JSON数据时,有时会发现返回的数据无法解析,而返回的结果为undefined。这种情况通常是由于以下原因引起的: 数据格式不正确:JSON 格式要求数据必须为名/值对构成的无序集合。如果返回的数据格式不正确,就无法解析成JSON对象。 跨域请求:由于浏览器的同源策略限制,如果 AJAX 请求的数据源与当前域不一致,则会遇到跨域问题。这…

    JavaScript 2023年6月11日
    00
  • webpack文件打包错误异常

    下面是关于“webpack文件打包错误异常”的完整攻略: 异常说明 在使用webpack进行文件打包时,可能会出现各种错误和异常,这些错误和异常可能会导致文件打包失败或编译过程中的错误,如语法错误等。常见的错误和异常有以下几种: 模块依赖错误 语法错误 文件丢失 webpack配置错误 针对不同类型异常,我们需要不同的解决方案以及错误提示信息。 解决方案 模…

    JavaScript 2023年5月28日
    00
  • js实现汉字排序的方法

    下面是js实现汉字排序的方法的详细攻略。 准备工作 在实现汉字排序之前需要准备一些工作。 安装JavaScript工具库pinyin。 npm install pinyin –save 引入pinyin工具库。 const pinyin = require(‘pinyin’); 实现步骤 获取待排序汉字数组。 const hanziArr = [‘北京’,…

    JavaScript 2023年5月19日
    00
  • js对url进行编码解码的三种方式总结

    下面是关于“js对url进行编码解码的三种方式总结”的详细解释。 1. URL编码 URL编码是将 URL 中非 ASCII 字符的字符转换成 “%” 加上两位十六进制值,即 URL 编码。 在JavaScript中,可以使用 encodeURIComponent() 方法实现 URL 编码。该方法可以将 URL 中所有需要转换的字符都进行转换。 下面是一个…

    JavaScript 2023年5月20日
    00
  • vue.js利用Object.defineProperty实现双向绑定

    Vue.js是一款流行的JavaScript框架,它提供了一种简单易用的双向绑定机制。这个机制能够直接监测数据模型的变化并及时更新视图,同时也支持用户的交互操作实现数据的修改。 Vue.js采用了基于Object.defineProperty实现的双向绑定机制,通过这个机制我们可以将数据模型和视图双向绑定起来。下面我们将详细介绍这个机制的实现方法。 1、Ob…

    JavaScript 2023年6月11日
    00
  • javascript中onmouse事件在div中失效问题的解决方法

    针对”javascript中onmouse事件在div中失效问题的解决方法”这个问题,我会提供以下完整攻略: 问题背景 在开发当中,有时候需要在div中使用onmouse事件,但是当事件无法正常触发时,很有可能是这个问题。这可能是由于div元素中默认没有激活onmouse事件,或者div元素中使用了absolute或者fixed进行定位等原因导致。下面我们来…

    JavaScript 2023年6月11日
    00
  • JavaScript中字符串的常用方法总结

    下面是完整的“JavaScript中字符串的常用方法总结”的攻略。 字符串长度 length 方法可以用来获取一个字符串的长度,即包含的字符数量。 const str = "Hello, World!"; console.log(str.length); // 13 字符串索引 字符串中的每一个字符都可以通过一个索引来访问,这个索引从 0…

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