【JavaScript】深度理解js的函数(function、Function)

简言

学了这么久的JavaScript,函数在JavaScript中最常用之一,如果你不会函数,你就不会JavaScript。
函数就是Function对象,一个函数是可以通过外部代码调用的一个“子程序”,它是头等(first-class)对象,因为它们可以像任何其他对象一样具有属性和方法。瞧瞧它的定义,注定它能做很多事情。
**函数是函数名、参数和函数体组成,然后由function声明。**我们一般说函数是指普通函数,还有另一种函数叫做生成器函数,这个生成器比较比较高级,生成器函数在执行时能暂停,后面又能从暂停处继续执行,这里不展开描述。

函数

在 JavaScript 中,每个函数其实都是一个Function对象。函数默认返回undefined

定义函数

声明一个函数(Function对象)有很多种方式。如果一个函数中没有使用 return 语句,则它默认返回undefined。要想返回一个特定的值,可以使用return 返回。

function声明

由function声明的函数,函数名会提升这个作用域的顶部,即在函数定义前也能使用。

function name([param[, param[, ... param]]]) { statements }
  • name 函数名。
  • param 传递给函数的参数的名称。
  • statements 组成函数体的声明语句。

函数表达式

由函数表达式创建的函数,函数名不会会提升,即必须在创建之后使用。

var myFunction = function name([param[, param[, ... param]]]) { statements }
  • name 函数名,可以省略,省略了后是匿名函数。
  • param 传递给函数的参数的名称。
  • statements 组成函数体的声明语句。

立即调用函数(IIFE)

当函数只使用一次时,通常使用IIFE (Immediately Invokable Function Expressions)。意思是当这个js文件被执行时调用一次。

(function () {statements;
})();
  • statements 组成函数体的声明语句。

箭头函数表达式(=>)

箭头函数是函数

var fn = ([param] [, param]) => { statements } param => expression
  • param 参数名称。
    零参数需要用 () 表示。只有一个参数时不需要括号。(例如 foo => 1)
  • statements or expression
    多个声明 statements 需要用大括号括起来,而单个表达式时则不需要。表达式 expression 也是该函数的隐式返回值。

Function构造函数 (不推荐)

函数(Function对象)可以用 new 操作符创建。
把 Function 的构造函数当作函数一样调用 (不使用 new 操作符) 的效果与作为 Function 的构造函数调用一样。

new Function (arg1, arg2, ... argN, functionBody)
  • arg1, arg2, … argN
    函数使用零个或多个名称作为正式的参数名称。每一个必须是一个符合有效的 JavaScript 标识符规则的字符串或用逗号分隔的字符串列表,例如“x”,“theValue”或“a,b”。

  • functionBody
    一个构成的函数定义的,包含 JavaScript 声明语句的字符串。

函数参数

函数参数(形参)一个重要的概念,它是函数体与外面作用域交互的媒介或桥梁。普通的参数由js各种类型定义,除此之外,它还有this、剩余参数和arguments对象。

形参

普通的参数由js各种类型定义,定义的参数可以在函数内使用,想传啥就传啥。
调用传参时,则按你定义参数的顺序传。

function fnParams(name,age = 18,object = {label: 'object形参',},fn = () => {},date = new Date(),arr = []
) {console.log(name, age, object, fn, date, arr)
}
fnParams()

调用时不传参数,参数为undefined,有默认值则值为默认值。
在这里插入图片描述

arguments对象

arguments 是一个对应于传递给函数的参数的类数组对象。
arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。
箭头函数使用arguments在浏览器环境下会报错。

function fnParams(name,age = 18,object = {label: 'object形参',},fn = () => {},date = new Date(),arr = []
) {console.log(name, age, object, fn, date, arr)console.log(arguments)
}
fnParams('zsk', () => {})const fn = (name) => {console.log(name, arguments)
}
fn('zsk')

在这里插入图片描述

剩余参数

剩余参数是es6的,剩余参数语法允许我们将一个不定数量的参数表示为一个数组。
如果函数的最后一个命名参数以…为前缀,则它将成为一个由剩余参数组成的真数组,其中从0(包括)到theArgs.length(排除)的元素由传递给函数的实际参数提供。

function(a, b, ...theArgs) {// ...
}

如上,theArgs就是剩余参数,它是一个数组,包含那些没有对应形参的实参,默认值[],不能更改默认值。

let fn = function (a, ...args) {console.log(a, args)
}
fn(1, 2, 3)

在这里插入图片描述

this

在绝大多数情况下,函数的调用方式决定了 this 的值(运行时绑定)。this 不能在执行期间被赋值,并且在每次函数被调用时 this 的值也可能会不同。可以使用 bind 方法来设置函数的 this 值,而不用考虑函数如何被调用的。箭头函数本身没有this,值为创建时外层上下文对象。

function fn2() {console.log('fn2::', this)const arrowFn = (a = 1) => {console.log('()=>{} ::', this)}const fn = function (a = 1) {console.log('fn::', this)}arrowFn()fn()let o = {fn: fn,}o.fn()
}
fn2()

在这里插入图片描述
bind()、call() 和 apply()方法可以改变this值。

a = 1
const obj = {a: 2,
}
function fn3() {// 'use strict'console.log(this.a)return this
}
fn3()fn3.bind(obj)()
fn3()
fn3.bind()()
fn3.call(obj, 1, 2)
fn3()
fn3.call()fn3.apply(obj, [1, 2])
fn3()
fn3.apply()

在这里插入图片描述

函数体

函数体没啥说的,什么都可以写。自己都可以调用。。。,递归就是这么来的。
如果有return 的话,可以返回函数,例如实现闭包、函数柯里化、高阶函数等。

函数属性

另外,函数本身还有一些属性和方法:

  • name 返回函数定义的名称。
  • length 只读属性,表示函数形参的个数
  • prototype 函数的原型对象
  • toString() 返回函数完整的源代码字符串

结语

有了函数,js就算玩出花来,也可以有条理性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 如何创建文件

我们在写一些教程的时候,经常会需要创建一些用于演示的文档,这些文档往往需要填充一些不特定的内容。那么如何快速的创建演示用的文档呢? docfaker.py docfaker.py是一个py脚本,用于创建一个简单的txt文档,docfaker.…

MySQL 从零开始:06 数据检索

文章目录 1、数据准备2、限制结果3、完全限定名4、排序检索 所谓数据检索,就是前面所讲的”增删改查“的”查“。 注:本文使用的“行”指数据表中的“记录”,“列”指数据表中的“字段”。 在第四节《表的增删改查》中已经介绍了 select 查询…

Hive命令行运行SQL将数据保存到本地如何去除日志信息

1.场景分析 先有需求需要查询hive数仓数据并将结果保存到本地,但是在操作过程中总会有日志信息和表头信息一起保存到本地,不符合业务需要,那如何才能解决该问题呢? 废话不多少,直接上代码介绍: 2.问题解决…

回归预测 | Matlab实现SSA-CNN-LSTM-Attention麻雀优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注意力机制)

回归预测 | Matlab实现SSA-CNN-LSTM-Attention麻雀优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注意力机制) 目录 回归预测 | Matlab实现SSA-CNN-LSTM-Attention麻雀优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注意力…

计算机网络NCEPU复习资料

目录 一.概述: 计算机网络组成: 计算机网络分类: 计算机网络体系结构: C/S架构与P2P架构区别: OSI开放式系统互连参考模型: OSI开放式系统互连参考模型 相关协议: 五层协议网…

Vue.js设计与实现阅读-3

Vue设计与实现阅读-3 1、声明式描述UI2、渲染器3、组件4、模板的工作原理5、Vue.js 是各个模块组成的有机整体 前言 前面一章我们了解了,开发体验是衡量一个框架的重要指标之一。提供友好的警告信息至关重要,但是越详细的警告信息,意味着框架…

5 微信小程序

功能开发 5 功能开发概要今日详细1.发布1.1 发布流程的问题1.2 组件:进度条1.3 修改data中的局部数据1.4 发布示例效果前端后端 1.5 闭包 2.获取前10条新闻(动态/心情,无需分页)3.复杂版4.文章详细页面 各位小伙伴想要博客相关资料…

【python入门】day26: 模拟高铁售票系统

界面 代码 #-*- coding:utf-8 -*- import prettytable as pt#---------导入漂亮表格 import os.path filename ticket.txt#更新座位状态 def update(row_num):#------更新购票状态with open(filename,w,encodingutf-8) as wfile:for i in range(row_num):lst1 [f{i1},有票,有…

Modbus协议学习第一篇之基础概念

什么是“协议” 大白话解释:协议是用来正确传递消息数据而设立的一种规则。传递消息的双方(两台计算机)在通信时遵循同一种协议,即可理解彼此传递的消息数据。 Modbus协议模型 Modbus协议模型较为简单,使用一种称为应用…

soc算法【周末总结】

1 实验一(SOC误差30%放电实验) 1.1 实验过程 1、对电池包进行充电,将昨天放空的电池包进行充电,充电至SOC40%左右; 2、电池包SOC为38%时,手动修改SOC值为70%,开始放电 3、SOC由70%缓慢降至4…

Windows下面基于pgsql15的备份和恢复

一、基础备份 1.创建一个文件用来存储备份数据 2.备份指令 $CurrentDate Get-Date -Format "yyyy-MM-dd" $OutputDirectory "D:\PgsqData\pg_base\$CurrentDate" $Command "./pg_basebackup -h 127.0.0.1 -U postgres -Ft -Pv -Xf -z -Z5 -D $O…

教育观察期刊投稿邮箱、投稿要求

《教育观察》创刊于2012年,是国家新闻出版总署批准的正规教育类学术期刊,本刊致力于在教育实践中以“观察”为方法,以“观察者”为主体,以“新观察”为旨趣,打造从教育实践中洞察教育未来的教育研究与交流的平台。主要…

关于Quartz远程调用服务方法失败如何解决,@Inner详细介绍

1.单独在要调用服务的controller写上相关方法(Inner(value true)要走aop,会检测是否有内部调用标识)具体见下述 2. 编写Feign远程调用的接口,注意加上RequestHeader(SecurityConstants.FROM) String from。因为inner(value true…

【LabVIEW FPGA入门】LabVIEW FPGA实现I2S解码器

该示例演示了如何使用 LabVIEW FPGA 解码 IS 信号。该代码可用于大多数支持高速数字输入的LabVIEW FPGA 目标(例如R 系列、CompactRIO)。IS 用于对系统和组件内的数字音频数据进行编码。例如,MP3 播放器或 DVD 播放器内部的数字音频通常使用 …

【从零开始学习Java重要集合】深入解读ThreadLocal类

目录 前言: ThreadLocal: ThreadLocal的内部结构: ThreadLocal的常用方法: 1.set方法: 2.get方法: 3.setInitialValue方法 remove方法(): ThreadLocalMap&…

MySQL数据库入门到大牛_高级_00_MySQL高级特性篇的内容简介

文章目录 一、整个MySQL的思维导图二、MySQL高级特性篇大纲1. MySQL架构篇2. 索引及调优篇3. 事务篇4. 日志与备份篇 一、整个MySQL的思维导图 下图为整个MySQL内容,01-05是基础篇,06-09是高级篇 二、MySQL高级特性篇大纲 MySQL高级特性分为4个篇章&…

mybatisplus配置

一、新建项目&#xff1a;com.saas.plusdemo 二、配置pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…

双向冒泡排序的数据结构实验报告

目录 实验目的&#xff1a; 实验内容&#xff08;实验题目与说明&#xff09; 算法设计&#xff08;核心代码或全部代码&#xff09; 运行与测试&#xff08;测试数据和实验结果分析&#xff09; 总结与心得&#xff1a; 实验目的&#xff1a; 理解双向冒泡排序算法的原…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷⑧

单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应处理&#xff0c;执行j10*x-y返回文字“j1&#xff1a;”和计算值&#xff0c;执行j(x-y)*(10⁵%7)返回文字“j2&#xff1a;”和计算值&#xff0c;执行jy*log(x10)返回文字“j3&#xff1a;”和计算值…

山西电力市场日前价格预测【2024-01-13】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-13&#xff09;山西电力市场全天平均日前电价为231.81元/MWh。其中&#xff0c;最高日前电价为345.71元/MWh&#xff0c;预计出现在00:15。最低日前电价为0.00元/MWh&#xff0c;预计出…