函数 作为 JS 的一等公民,随处可见它的身影。

我理解的它最主要作用就是用来提取重复代码,但凡有 JS 代码需要复制粘贴的时候,那么这时候就可以考虑使用函数封装了。

当函数写在对象中的时候,这时候它变了一个名字,称之为 方法

function 声明

在使用 function 关键字声明函数时,需注意声明提升问题,意思就是 function 声明的函数,不存在先后顺序,任意位置都可以调用。

function test() {
console.log('前端路引');
}
test() // 调用函数

test 就是函数的名字,函数名的规则和变量声明差不多,只要不是数字和特殊字符开头,语法规则都是允许的,包括都可以使用中文定义函数,虽然不建议这么使用!

function 测试() {
console.log('前端路引');
}
测试() // 调用函数

声明提升

function 定义的函数会提升到作用域顶部,所以可以在函数定义之前调用,比如:

test() // 此处可以调用 function 声明的函数

const var1 = '前端路引 -- 1'
console.log(var1) function test() {
console.log('前端路引 -- 2');
}

输出:

前端路引 -- 2
前端路引 -- 1

包括写在 if 判断中的 function 都会提升到作用域顶部,比如:

test()
if (false) {
console.log('前端路引 -- 1'); // 此行代码不会执行
function test() {
console.log('前端路引 --2');
}
}

输出:

前端路引 -- 2

所以不建议在条件语句中去使用 function 声明函数!

函数表达式

函数表达式就是使用一个变量来保存函数,这种写法有个好处是可以控制定义函数的逻辑。

声明方式:

const test = function() {
console.log('前端路引');
}
test()

表达式声明的函数只能在声明之后调用,如果在声明之前调用,代码会报错:

test() // 报错 ReferenceError: test is not defined
const test = function() {
console.log('前端路引');
}

使用 var 声明时会报错 TypeError: test is not a function:

test() // 报错 TypeError: test is not a function
var test = function() {
console.log('前端路引');
}

在 if 中声明的函数表达式,在外部无法调用:

if (false) {
const test = function() {
console.log('前端路引');
}
}
test() // 报错 ReferenceError: test is not defined

箭头函数

箭头函数的声明与函数表达式有些相似,都需要通过变量保存。

声明方式:

const test1 = () => {
console.log('前端路引');
}
const test2 = (a, b) => a + b; // 单行时候可以省略花括号,直接返回值
// 等价于
// const test2 = (a, b) => {return a + b}
test1() // 输出:前端路引
console.log(test2(1, 2)) // 输出:3

箭头函数和函数表达式的区别:

  • 箭头函数自身没有 this 绑定,继承外层作用域的 this
const test1 = function () {
console.log(this)
}
const test2 = () => {
console.log(this)
}
test1.bind({a: '123'})() // 获得对象 {a: '123'}
test2.bind({a: '123'})() // 获得全局对象 window
  • 由于没有 this,所以也无法作为构造函数使用,不能使用 new 实例化。
const test1 = function () {
console.log('前端路引')
}
const test2 = () => {
console.log('前端路引')
}
new test1()
new test2() // 报错 TypeError: test2 is not a constructor
  • 箭头函数也没有 arguments 对象,所以无法通过 arguments 相关方法,比如 arguments.callee 获取函数自身。
const test1 = function () {
console.log(arguments) // 获取到参数对象
}
const test2 = () => {
console.log(arguments) // 报错 ReferenceError: arguments is not defined
}
test1('前端路引')
test2('前端路引')

生成器函数

ES6 新增的声明方式,常规的业务代码一般很少使用(也可能是我的段位太低~~)。

function* test() {
yield 1;
yield 2;
}
const temp = test()
console.log(temp.next()) // 输出:{value: 1, done: false}
console.log(temp.next()) // 输出:{value: 2, done: false}
console.log(temp.next()) // 输出:{value: undefined, done: true}

这种方式可以使用 yield 暂停函数执行,多用于异步迭代场景。

看一个异步使用 yield 例子:

function* testAsync() {
const data = yield new Promise(resolve => {
setTimeout(() => resolve('Hello World'), 1000); // 模拟异步操作
});
console.log(data); // 此处的 data 是 next 传入数据,不是 Promise 返回数据
} async function run() {
const generator = testAsync();
const result = await generator.next().value; // 等待 Promise
generator.next(result); // 将结果传递回生成器并继续执行
}
run()

构造函数 Function 声明

虽然不建议使用这种声明函数,咱们学习了解一下还是没问题的。

const test = new Function('a', 'b', 'return a + b');
console.log(test(1, 2))

问题:

1、通过字符串动态生成代码,存在安全风险,容易出现代码注入攻击。

2、每次都会解析字符串,性能会比较低。

写在最后

函数 作为 JS 语言中的一等公民,几种声明方式区别是面试中的常客,经常被问及 箭头函数function 有哪些区别。

函数 是基础,也是函数式编程的核心,必须熟练掌握~~

Web前端入门第 64 问:JavaScript 几种函数定义方式有什么区别?的更多相关文章

  1. Javascript和JQuery函数定义方式

    Javascript 函数定义方式 1.function show() {     } 2.var cal = function() {     },必须先声明才能调用 示例: <html> ...

  2. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  3. Android零基础入门第64节:揭开RecyclerView庐山真面目

    原文:Android零基础入门第64节:揭开RecyclerView庐山真面目 大家还记得之前在第38期~第50期都在学习列表控件吗,其中用了8期讲ListView的使用,相信都已经掌握好了吧.那么本 ...

  4. web前端关于html转义符的常用js函数

    web前端关于html转义符的常用js函数 //去掉html标签 function removeHtmlTab(tab) { return tab.replace(/<[^<>]+? ...

  5. web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】

    http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...

  6. web前端(13)—— 了解JavaScript,JavaScript的引入方式

    从本篇博文开始,将进入web前端方便最关键最重要的部分——javascript,学到后面你就知道它真的太重要了 什么是JavaScript JavaScript一种直译式的脚本语言,是一种动态类型.弱 ...

  7. WEB前端工程师整理的原生JavaScript经典百例

    一.原生JavaScript实现字符串长度截取 二.原生JavaScript获取域名主机 三.原生JavaScript转义html标签 四.原生JavaScript时间日期格式替换 Date.prot ...

  8. Web前端基础怎么学? JavaScript、html、css知识架构图

    以前开发者只要掌握 HTML.CSS.JavaScript 三驾马车就能胜任一份前端的工作了.而现在除了普通的编码以外,还要考虑如何性能优化,如何跨端.跨平台实现功能,尤其是 AI.5G 技术的来临, ...

  9. web前端学习之HTML CSS/javascript之一

    前端编码之路之坎坷,web前端应该一直是个战场吧,各种浏览器的不兼容,各种小细节的修改,要往一个好的产品经理方向走,实在是难,昨天听了一位十年经验的产品经理讲座,最重要的恐怕就是协调资源的能力,而协调 ...

  10. web前端学习(四)JavaScript学习笔记部分(3)-- JavaScript函数+异常处理+事件处理

    1.Javascript函数-了解函数的用途 1.1.函数: 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块 2.Javascript函数-定义函数 2.1.function必须小写 3. ...

随机推荐

  1. JMeter BeanShell 获取 HTTP Request 中的 Name

    场景:添加 JMeter log 输出,想输入自定义请求的名称 // 获取 response body prev.getResponseDataAsString(); // 获取 HTTP Reque ...

  2. MongoDB入门介绍与案例分析

    一.MongoDB 数据库定位 首先我们来看一下 MongoDB 是什么样的数据库.数据库分两大类: OLTP(Online Transaction Processing)联机事务处理. OLAP(O ...

  3. VTK-8.2.0源码编译和初步使用(Cmake+VS2015+Qt5.14.2)

    一.准备数据 1.首先确保已安装VS5015和Qt5.14.2 2.下载Cmake并安装:Download CMake 3.下载VTK-8.2.0源码和数据并解压:Download | VTK 二.C ...

  4. Proxmox ve(Pve) 安装windows server

    1.安装proxmox ve点击直达 官网地址 下载下来如果下载速度太慢 可以去安装个IDM https://www.52pojie.cn/thread-1013874-1-1.html 然后需要制作 ...

  5. [每日算法 - 华为机试] leetcode45 :跳跃游戏 II 「动态规划神器推荐」

    leetcode入口 45. 跳跃游戏 IIhttps://leetcode.cn/problems/jump-game-ii/ 题目描述 给定一个长度为 n 的 0 索引整数数组 nums.初始位置 ...

  6. [源码系列:手写spring] IOC第一节:简单bean容器

    本专栏带领大家手写一遍spring的核心代码,包括IOC,AOP,三级缓存... 第一节较为简单,后面的章节会逐渐提升代码量和复杂度,喜欢的同学记得订阅哦  ̄▽ ̄ 定义一个简单的bean容器BeanF ...

  7. zk源码—2.通信协议和客户端原理

    大纲 1.ZooKeeper如何进行序列化 2.深入分析Jute的底层实现原理 3.ZooKeeper的网络通信协议详解 4.客户端的核心组件和初始化过程 5.客户端核心组件HostProvider ...

  8. luat编程MQTT的自动重连失败分析

    正确用法 查看代码 --- 模块功能:MQTT客户端处理框架 -- @author openLuat -- @module mqtt.mqttTask -- @license MIT -- @copy ...

  9. eolinker响应预处理:返回结果内循环读取同类数据,设置为变量

    特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html 场景描述: 删除(清空)购物车接口,需要传入获取的每一项 ...

  10. QUBO建模

    技术背景 QUBO(Quadratic Unconstrained Binary Optimization)模型是一种常用于求解组合优化问题的一种技术,它所能够求解的问题是这样定义的:给定一个布尔类型 ...