4.函数是特殊的对象 - JS

万物皆是对象,一切存为数据/值。对象是值,函数也是值。

行为对象 - 函数

函数是可以被调用的“行为/动作对象”,一个函数就是一个行为/动作。作为对象的基本操作都适用,如增/删属性,按引用传递等。


属性 name

  1. name 属性就是函数名;
  2. 匿名函数(包括箭头函数)本身没有函数名,name='',但可以通过赋值给变量,使变量成为函数,此时函数名就是变量名了;
  3. 如果将非匿名函数赋值给变量,则函数名函数声明时的名称;
  4. Function 构造函数返回的函数,name 属性的值为 anonymous
  5. bind 返回的函数,name 属性值会加上 bound 前缀;
  6. 对象里的方法,也有 name 属性·。
function func() {}
func.name			// 'func'let func2 = function () {}
func2.name			// 'func2'let g = function func3() {}
g.name				// 'func3' !!(new Function).name	// anonymousfunc.bind({}).name // "bound func"const o = { sayHi() {} }
o.sayHi.name		// 'sayHi'

属性 length

函数的 length 属性反映参数数量,计算原则:

  1. 一个普通参数的贡献是 1;
  2. 一个解构参数的贡献是 1;
  3. 剩余参数的贡献是 0;
  4. 默认参数的贡献是0,且截断其后的参数贡献。
(function (a) {}).length			// 1
(function ([a, b]) {}).length		// 1
(function ({ a, b }) {}).length 	// 1
(function (a, ...rest) {}).length	// 1
(function (a, b=0) {}).length		// 1
(function (a=0, b) {}).length		// 0 默认参数后的贡献被截断

自定义属性

作为一个对象,函数可以自定义任何属性,并且可以在函数体中使用。

函数属性有时会用来替代闭包。闭包的环境更隐蔽,而函数的属性可以更直观的访问。

function sayHi() { console.log(`${++sayHi.callCount} 次说你好。`) }
sayHi.callCount = 0;
sayHi()		// 第 1 次说你好。
sayHi()		// 第 2 次说你好。/* 使用函数属性建立计数器,而不是闭包:闭包需要在外部函数中声明计算值的变量,函数属性直接绑定在函数上。 */
function makeCounter(init=0) {// let val = init;function counter() {// return val++;return counter.val++;}counter.val = init;	// 属性初始化return counter;
}
let counter = makeCounter();
counter();	 			// 0
counter(); 				// 1

函数的构造函数 Function

任何对象都有构造函数,函数作为一个对象也不例外,但函数对象的构造函数却很少使用,是不得已才使用的创建函数的方法。

基本语法 let func = new Function ([arg1, arg2, ...argN], functionBody)

  1. 参数都是字符串,最后一个参数是函数体字符串;
  2. 通过执行字符串来构建函数,会遇到和 eval() 类似的的安全问题和(相对较小的)性能问题,不同的是,Function 构造函数创建的函数只能在全局作用域中运行,所以不能用来创建闭包;
  3. 应用场景特殊,比如在复杂的 Web 应用程序中,当需要从服务器获取代码、动态地从模板编译函数时才会使用。
let x = 10;		// 一个全局变量function gen1() {let x = 20;return new Function("return x;"); // 这个 x 指向全局 x,不能构成闭包
}function gen2() {let x = 20;function f() { return x; } 	// 这个 x 指向上面的局部 xreturn f;		// 此函数与内部环境构成闭包!!
}const f1 = gen1();
f1()			// 10
const f2 = gen2();
f2()			// 20

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

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

相关文章

基于若依的ruoyi-nbcio流程管理系统自定义业务回写状态的一种新方法(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/n…

vue的简单学习_大屏

一、 vue-cli的配置 1.1 vue-cli的安装 npm install -g vue/cli # 或 yarn global add vue/cli # 使用npm install -g vue/cli安装出现npm warn错误。通过npm install -g yarn 然后使用第二条命令下载。下载后并没有将vue加到环境变量中,需要在c盘中找到路径加到环…

【MATLAB源码-第136期】基于matlab的变色龙群优化算法CSA)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境: MATLAB 2022a 1、算法描述 变色龙群优化算法(Chameleon Swarm Algorithm,CSA)是一种新颖的群体智能优化算法,受到自然界中变色龙捕食和社交行为的启发。变色龙以其独特的适应能力而著称,能够根…

前缀和与差分

前缀和 S [ i ] Σ i j 1 A [ j ] S [ i − 1 ] A [ i ] \text{S}\left[ \text{i} \right] \underset{\text{j}1}{\overset{\text{i}}{\Sigma}}\text{A}\left[ \text{j} \right] \text{S}\left[ \text{i}-1 \right] \text{A}\left[ \text{i} \right] S[i]j1Σi​A[j]S[i−1…

后端程序员入门react笔记(一)

相关参考 react 首先,我们先大概了解一下什么是react以及react可以干什么。 React 是 Facebook 开源的一个用于构建用户界面的一款 JavaScript 库,主要用于构建 UI。 react的特点 声明式编程 react使用jsx进行渲染,这是一种类似html的语法…

打开双重el-dialog后出现遮罩后如何解决?

背景&#xff1a; 打开el-dialog后&#xff0c;再次打开另外一个el-dialog&#xff0c;出现以下画面。 解决方式&#xff1a;在第二个el-dialog增加append-to-body <el-dialog :close-on-click-modal“true” :visible.sync“createVisible” v-if“createVisible” :width…

算法提升——LeetCode383场周赛总结

周赛题目 边界上的蚂蚁 边界上有一只蚂蚁&#xff0c;它有时向左走&#xff0c;有时向右走。 给你一个非零整数数组nums。蚂蚁会按顺序读取nums中的元素&#xff0c;从第一个元素开始直到结束。每一步&#xff0c;蚂蚁会根据当前元素的值移动&#xff1a; 如果nums[i]<0…

BLIP-2:低计算视觉-语言预训练大模型

BLIP-2 BLIP 对比 BLIP-2BLIPBLIP-2如何在视觉和语言模型之间实现有效的信息交互&#xff0c;同时降低预训练的计算成本&#xff1f;视觉语言表示学习视觉到语言的生成学习模型架构设计 总结主要问题: 如何在计算效率和资源有限的情况下&#xff0c;有效地结合冻结的图像编码器…

Ray on ACK 实践探索之旅 - RayCluster 篇

作者&#xff1a;张杰、霍智鑫、行疾 什么是 Ray&#xff1f; Ray 是一个开源框架&#xff0c;专为构建可扩展的分布式应用程序而设计&#xff0c;旨在通过提供简单直观的 API&#xff0c;简化分布式计算的复杂性&#xff0c;让开发者能够便捷高效地编写并行和分布式 Python …

【MySQL】- 09 Select Count

【MySQL】- 09 Select Count 1认识COUNT2 COUNT(列名)、COUNT(常量)和COUNT(*)之间的区别3 COUNT(*)的优化 4 COUNT(*)和COUNT(1)5 COUNT(字段)总结 数据库查询相信很多人都不陌生&#xff0c;所有经常有人调侃程序员就是CRUD专员&#xff0c;这所谓的CRUD指的就是数据库的增删…

文心一言 VS 讯飞星火 VS chatgpt (194)-- 算法导论14.3 2题

二、用go语言&#xff0c;改写 INTERVAL-SEARCH 的代码&#xff0c;使得当所有区间都是开区间时&#xff0c;它也能正确地工作。 文心一言&#xff0c;代码正常运行&#xff1a; 在Go语言中&#xff0c;处理开区间&#xff08;open intervals&#xff09;时&#xff0c;我们需…

Qt环境搭建+简单程序实现

Qt是什么 Qt是一个跨平台的C图形用户界面应用程序框架。 框架的本质就是一群大佬发明的让菜鸡写出来的代码也也比较规范 也就是限制程序员的自由&#xff0c;让程序员写出来的代码规范。 库和框架有相似性。 库是被程序员调用的&#xff0c;&#xff08;程序员是主体&…

prettier和eslint冲突怎么解决?

前提&#xff1a;项目中已安装&#xff1a;eslint&#xff0c;prettier&#xff0c;已配置.eslintrc和.prettierrc eslint&#xff1a;用来校验和处理js文件&#xff0c;逻辑和格式问题 prettier&#xff1a;用来校验和处理js文件&#xff0c;css文件&#xff0c;html文件&…

06 - python操作xml

认识XML 与HTML很像&#xff0c;是一种将数据存储在标记之间的标记语言&#xff0c;用户可以自定义自己的标记。 XML文件可以表示称为&#xff1a;XML树。这个XML树从根元素开始&#xff0c;根元素进一步分支到子元素。XML文件的每个元素都是XML树的一个节点&#xff0c;没有…

Liunx基本指令

目录 1、ls 列出当前路径下的文件 2、pwd 打印当前工作目录 (print working directory) 3、cd 进入路径 4、mkdir 创建文件夹(make dirctory) 5、touch 创建文件 6、cp 复制(copy) 7、mv 移动/剪切、重命名 8、rm 删除 (remover) 9、vim 文本编辑器 10、cat 打开文件…

Flink实战五_直播礼物统计

接上文&#xff1a;Flink实战四_TableAPI&SQL 1、需求背景 现在网络直播平台非常火爆&#xff0c;在斗鱼这样的网络直播间&#xff0c;经常可以看到这样的总榜排名&#xff0c;体现了主播的人气值。 人气值计算规则&#xff1a;用户发送1条弹幕互动&#xff0c;赠送1个荧…

C++新特性 扩展和聚合类型

本篇文章我们来讲一下扩展和聚合类型 1.聚合类型的定义: 在计算机编程中&#xff0c;聚合类型是一种将多个数据元素组合到一个单独的数据结构中的方式。它可以包含不同类型的数据&#xff0c;并且这些数据可以按照特定的顺序或规则进行组织。 常见的聚合类型有数组、结构体和类…

机器人抓取 [ 题目/摘要 ] 更新中..

题目&#xff1a;Robotic Grasping of Novel Objects using Visionl 链接&#xff1a;机器人抓取新物体 | IEEE Xplore&#xff08;IEEE的Xplore&#xff09; 【端到端】 摘要&#xff1a;我们考虑抓取新物体的问题&#xff0c;特别是第一次通过视觉看到的物体。抓取以前未知的…

在线JSON转SQL工具

在线JSON转SQL - BTool在线工具软件&#xff0c;为开发者提供方便。在线JSON转SQL工具可以将JSON文件中的数据或者JSON对象转换为SQL插入语句&#xff0c;方便用户将数据导入到数据库中。用户可以通过简单的界面上传JSON文件&#xff0c;或者文本框输入&#xff0c;点击JSON转S…

Python 处理小样本数据的文档分类问题

在处理小样本数据的文档分类问题时&#xff0c;可以尝试使用迁移学习或者基于预训练模型的方法&#xff0c;如BERT、GPT等。然而&#xff0c;直接在这里编写一个完整的深度学习文档分类代码超出了这个平台的限制&#xff0c;但我可以为你提供一个基本的思路和简单示例&#xff…