首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
JavaScript类型:关于类型,有哪些你不知道的细节?
JavaScript对象:面向对象还是基于对象?
JavaScript对象:我们真的需要模拟类吗?
JavaScript对象:你知道全部的对象分类吗?
JavaScript执行(一):Promise里的代码为什么比setTimeout先执行?
JavaScript执行(二):闭包和执行上下文到底是怎么回事?
JavaScript执行(三):你知道现在有多少种函数吗?
JavaScript执行(四):try里面放return,finally还会执行吗?
JavaScript词法:为什么12.toString会报错?
(小实验)理解编译原理:一个四则运算的解释器
JavaScript语法(预备篇):到底要不要写分号呢?
JavaScript语法(一):在script标签写export为什么会抛错?
JavaScript语法(二):你知道哪些JavaScript语句?
JavaScript语法(三):什么是表达式语句?
JavaScript语法(四):新加入的**运算符,哪里有些不一样呢?
HTML语义:div和span不是够用了吗?
HTML语义:如何运用语义类标签来呈现Wiki网页?
CSS语法:除了属性和选择器,你还需要知道这些带@的规则
HTML元信息类标签:你知道head里一共能写哪几种标签吗?
CSS 选择器:如何选中svg里的a元素?
CSS选择器:伪元素是怎么回事儿?
HTML链接:除了a标签,还有哪些标签叫链接?
CSS排版:从毕昇开始,我们就开始用正常流了
HTML替换型元素:为什么link一个CSS要用href,而引入js要用src呢?
HTML小实验:用代码分析HTML标准
CSS Flex排版:为什么垂直居中这么难?
CSS动画与交互:为什么动画要用贝塞尔曲线这么奇怪的东西?
HTML语言:DTD到底是什么?
CSS渲染:CSS是如何绘制颜色的?
CSS小实验:动手做,用代码挖掘CSS属性
HTML·ARIA:可访问性是只给盲人用的特性么?
浏览器:一个浏览器是如何工作的?(阶段一)
浏览器:一个浏览器是如何工作的?(阶段二)
浏览器:一个浏览器是如何工作的(阶段三)
浏览器:一个浏览器是如何工作的?(阶段四)
浏览器:一个浏览器是如何工作的?(阶段五)
浏览器DOM:你知道HTML的节点有哪几种吗?
浏览器CSSOM:如何获取一个元素的准确位置
浏览器事件:为什么会有捕获过程和冒泡过程?
浏览器API(小实验):动手整理全部API
性能:前端的性能到底对业务数据有多大的影响?
工具链:什么样的工具链才能提升团队效率?
持续集成:几十个前端一起工作,如何保证工作质量?
搭建系统:大量的低价值需求应该如何应对?
前端架构:前端架构有哪些核心问题?
当前位置:
首页>>
技术小册>>
深入学习前端重构知识体系
小册名称:深入学习前端重构知识体系
### JavaScript执行(三):你知道现在有多少种函数吗? 在深入探讨JavaScript执行机制的广阔领域中,函数作为其核心组成部分,扮演着至关重要的角色。JavaScript的函数不仅仅是代码的封装单元,它们还是实现抽象、复用、回调、闭包等高级编程技巧的基础。随着ECMAScript标准的不断演进,JavaScript中的函数形式也日益丰富多样。本章节将深入剖析JavaScript中当前存在的几种主要函数类型,揭示它们各自的特性与用途,帮助读者构建更加全面和深入的前端重构知识体系。 #### 1. 普通函数(Plain Functions) **定义与特点**: 普通函数是JavaScript中最基础也是最常见的函数类型。它们通过`function`关键字定义,可以包含参数、函数体以及返回值。普通函数既可以作为独立的执行单元,也可以被赋值给变量、作为参数传递给其他函数,或者作为其他对象的属性。 **示例**: ```javascript function sayHello(name) { return `Hello, ${name}!`; } const greeting = sayHello('Alice'); // 调用函数并获取返回值 console.log(greeting); // 输出:Hello, Alice! ``` **用途**: - 封装逻辑,实现代码复用。 - 作为回调函数,在异步操作中使用。 - 作为事件处理器,响应用户交互。 #### 2. 箭头函数(Arrow Functions) **定义与特点**: 箭头函数是ES6引入的一种更简洁的函数写法,它使用`=>`符号来定义函数。箭头函数不绑定自己的`this`、`arguments`、`super`或`new.target`。这些函数表达式更适用于非方法函数,并且它们不能用作构造函数。 **示例**: ```javascript const sayHello = (name) => `Hello, ${name}!`; const greeting = sayHello('Bob'); console.log(greeting); // 输出:Hello, Bob! ``` **与普通函数的区别**: - 语法更简洁。 - 不绑定自己的`this`,`this`的值继承自外围作用域(词法作用域)。 - 不支持`arguments`对象,但可以通过剩余参数(`...args`)来访问传入的参数列表。 - 不支持`new`操作符,不能用作构造函数。 **用途**: - 简化回调函数书写。 - 在需要保持`this`上下文一致性的场景中使用。 - 编写链式调用。 #### 3. 立即执行函数表达式(IIFE - Immediately Invoked Function Expression) **定义与特点**: 立即执行函数表达式是一种在定义后立即执行的函数。它通常被包裹在圆括号中以避免语法错误,并且整个表达式再次被圆括号包围,最后加上一对圆括号以立即执行该函数。IIFE常用于创建局部作用域,防止变量污染全局命名空间。 **示例**: ```javascript (function() { var localVariable = 'I am local'; console.log(localVariable); // 输出:I am local })(); // 尝试访问localVariable会导致ReferenceError // console.log(localVariable); // ReferenceError: localVariable is not defined ``` **用途**: - 创建私有变量和函数,防止全局命名空间污染。 - 封装模块代码,实现模块化编程。 #### 4. 构造函数(Constructor Functions) **定义与特点**: 构造函数是一种特殊的函数,用于创建和初始化对象。它们通常通过`new`关键字来调用,`new`操作符会执行以下步骤:创建一个新对象,将构造函数的`this`指向这个新对象,执行构造函数中的代码(为新对象添加属性),最后返回这个新对象(如果构造函数显式返回了一个对象,则返回该对象,否则返回新创建的对象)。 **示例**: ```javascript function Person(name, age) { this.name = name; this.age = age; } const alice = new Person('Alice', 30); console.log(alice.name); // 输出:Alice console.log(alice.age); // 输出:30 ``` **与普通函数的区别**: - 主要用于创建和初始化对象。 - 可以通过`new`关键字调用。 - 构造函数内部通常使用`this`来引用新创建的对象。 **用途**: - 实现基于类的面向对象编程。 - 封装对象的创建过程,提高代码复用性。 #### 5. 工厂函数(Factory Functions) **定义与特点**: 工厂函数是返回新创建对象的函数。它们并不依赖于`new`操作符,而是直接返回对象字面量或对象实例。工厂函数提供了一种封装对象创建逻辑的方式,使得创建对象的代码更加集中和易于管理。 **示例**: ```javascript function createPerson(name, age) { return { name: name, age: age, greet: function() { return `Hello, my name is ${this.name}.`; } }; } const bob = createPerson('Bob', 25); console.log(bob.greet()); // 输出:Hello, my name is Bob. ``` **与普通函数的区别**: - 主要目的是创建并返回对象。 - 不使用`new`关键字。 - 封装了对象的创建逻辑。 **用途**: - 在不依赖类继承的场合下创建对象。 - 实现简单的工厂模式。 #### 6. 生成器函数(Generator Functions) **定义与特点**: 生成器函数是ES6中引入的一种特殊函数,它可以暂停执行和恢复执行,这是通过`function*`语法和`yield`表达式实现的。生成器函数返回一个遍历器对象,这个对象遵守迭代器协议,即拥有一个`next`方法,每次调用`next`方法都会返回一个对象,该对象包含两个属性:`value`和`done`。`value`属性表示`yield`表达式的值,`done`属性表示遍历是否完成。 **示例**: ```javascript function* generatorFunction() { yield 'Hello'; yield 'World'; return 'The end'; } const gen = generatorFunction(); console.log(gen.next().value); // 输出:Hello console.log(gen.next().value); // 输出:World console.log(gen.next().value); // 输出:The end console.log(gen.next().done); // 输出:true ``` **用途**: - 实现异步编程的另一种方式(与Promise和async/await相比)。 - 简化复杂迭代逻辑的实现。 - 创建无限序列。 #### 7. 异步函数(Async Functions) **定义与特点**: 异步函数是ES8中引入的,用于简化基于Promise的异步代码。异步函数通过`async`关键字声明,使得函数内部可以使用`await`表达式来暂停异步操作的执行,直到Promise解决(resolve),然后继续执行异步函数并返回解决后的值(作为Promise对象返回)。 **示例**: ```javascript async function fetchData() { const response = await fetch('https://api.example.com/data'); const data = await response.json(); return data; } fetchData().then(data => { console.log(data); }).catch(error => { console.error('Error fetching data:', error); }); ``` **用途**: - 简化异步编程,使代码更易于阅读和维护。 - 与Promise结合使用,处理异步操作。 - 支持`try...catch`语句直接捕获异步操作中的错误。 ### 总结 JavaScript中的函数类型丰富多样,每种函数类型都有其特定的用途和优势。从基础的普通函数和箭头函数,到面向对象的构造函数和工厂函数,再到用于异步编程的生成器函数和异步函数,每种函数都在JavaScript的编程实践中扮演着不可或缺的角色。深入理解这些函数类型,不仅能够帮助我们编写出更加高效、可读和可维护的代码,还能够为我们在前端重构过程中提供更多的选择和灵活性。通过本章的学习,希望读者能够掌握JavaScript中各种函数类型的核心概念和使用方法,进而在构建前端知识体系的过程中迈出坚实的一步。
上一篇:
JavaScript执行(二):闭包和执行上下文到底是怎么回事?
下一篇:
JavaScript执行(四):try里面放return,finally还会执行吗?
该分类下的相关小册推荐:
Flutter核心技术与实战
Javascript-ES6与异步编程
零基础学JavaScript
ES6入门指南
Node.js 开发实战
javascript设计模式原理与实战
JavaScript面试指南
编程入门课:Javascript从入门到实战
剑指javascript-ES6
经典设计模式Javascript版
Javascript重点难点实例精讲(一)
npm script实战构建前端工作流