js函数扩展内容---多参数,函数属性,字符串生成函数

1.多参数

在js中,Math.max()方法可以接受任意数量的参数,

Math.max(1,2,3,4);//4
Math.max(1,2,3,4,5,6,7,8,9,10)//10

在max方法里面有一个rest参数,它接受了所有参数全部合成到了一个number数组里面,

function rest(a,b,...arg){// 使用rest 参数时,必须放在参数列表的最后console.log(arg);
}rest(1,2,3,4,5,6,7,8,9,10)//[3,4,5,6,7,8,9,10]

注意:使用rest 参数时,必须放在参数列表的最后 

 rest参数:类似扩展运算 ...,rest参数也使用...符号,但它的功能相反,在定义函数时使用,表示将多余的参数收集到一个数组中

和扩展运算区分开

  • 扩展运算:用于使用方法时,拆分数组或对象
  • rest参数 :用于定义方法时,合并参数

使用rest参数可以任意多个参数合成一个数组,并在函数内调用,理论上来说函数使用rest可以使用无数多个参数,

实现max方法

// 对rest参数进行比较
function myMax(...args) {// 设置max接受最大值,初始值为第一个参数let max = args[0];// 遍历数组,如果当前值大于max,则将max设置为当前值args.forEach((item)=>{if(item>max){max=item;}})return max;
}
console.log(myMax(1,2,3,4,30,5,6,7,8,9,10));//30

2.函数属性

在js中函数也是对象,一个函数也能像对象一样设置属性,同时它还有一些默认属性

console.dir(function name(){})

name

绝大部分函数都有name属性值,它存储了函数的名称

function fn(){console.log(fn.name);return fn.name;
}fn();//fn
console.log(fn());//fn fn
console.log(fn.name);//fn

 值得注意的是,函数属性是绑定在函数对象上的,在函数体外也能访问

// 对于赋值给变量的函数,函数本身是匿名的,函数name是变量名,
// 非匿名函数赋值,函数name是函数名
const f = function(){};
const fun = ()=>{}
const Fn = function F(){}console.log(f.name);//f
console.log(fun.name);//fun
console.log(Fn.name);//F

对于赋值给变量的函数,函数本身是匿名的,函数name是变量名,非匿名函数赋值,函数name是函数名,

没有name属性值的情况

// 没有name属性值
const fArr = [function(){}]
console.log(fArr[0].name);//''

length

函数的length属性表示了函数形参的个数,但是不包括rest参数

function fa(a,b,c,...arg){console.log(fa.length);return fa.length;
}
console.log(fa.length);//3
fa(1,2,3,4,5,6,7,8,9,10);//3,和实参数量无关

要注意和argments的length区分开

  • function.length:表示的是函数除了rest参数外的形参数量,定义函数时的普通参数个数
  • argments.length:表示使用函数时的实参数量,使用函数传入的参数个数

自定义函数属性

除了默认的属性,还可以自定义函数的属性

function add(){  return add.count++;
}add.count = 0;
console.log(add(),add(),add(),add());//0 1 2 3

设置函数属性,可以重写一个闭包结构,关于闭包可以参考:

js闭包------简单理解闭包含义_js 闭包累加-CSDN博客

// 使用内置变量的闭包
function count(){let sum = 0;return function (){return sum++;}
}
const addSum = count();console.log(addSum(),addSum(),addSum(),addSum());//0 1 2 3// 使用函数属性的闭包
function c(){c.count = 0;return function (){return c.count++;}
}
const addCount = c();console.log(addCount(),addCount(),addCount(),addCount());//0 1 2 3

都达到了累加的效果,但是它们的区别在于,闭包中的变量不能被外部访问,而函数属性可以被外部访问

c.count = 20;
console.log(addCount());//20

注意:count++会先赋值在自增 

3.字符串生成函数

使用字符串生成函数:接受一串字符串,将字符串转成函数,这常常在服务端返回脚本时的场景使用,

常规生成一个函数的方法有,function,new Function,

eval()

eval()将传入的字符串当做 JavaScript 代码进行执行,这是一个危险的api,容易被注入攻击,

let str = `function newFn(){console.log('这是eval改变字符串新生成的函数')
}`//eval()函数会将字符串作为JavaScript代码进行解析和执行
eval(str);
newFn();//这是eval改变字符串新生成的函数

new Function()

 new Function()会将字符串转成函数体内容

// new Function()() 也可以将字符串作为函数体进行解析和执行
new Function('console.log("这是new Function()改变字符串新生成的函数")')();//这是new Function()改变字符串新生成的函数
let newF= new Function('console.log("这是new Function()改变字符串新生成的函数")');
newF();//这是new Function()改变字符串新生成的函数

setTimeout()

setTimeout()会将字符串参数识别成函数执行,

// 使用setTimeout()函数
setTimeout(`(function newFn(){console.log('这是setTimeout()改变字符串新生成的函数')})()`
);//这是setTimeout()改变字符串新生成的函数

第一个参数支持输入函数或者字符串,字符串会自动解析成js代码,第二个参数没有时会被塞到事件队列最前面等待执行,所有这是一个异步过程,

script标签

可以通过script标签的innerHTML属性将字符串转成函数,但是这种方法只能在浏览器种使用,node环境下是没有dom对象的

// 使用script标签
const script = document.createElement('script');
script.innerHTML = `(function newFn(){console.log('这是script标签改变字符串新生成的函数')
})()`
document.body.appendChild(script);//这是script标签改变字符串新生成的函数

这是一个同步的代码,在setTimeout之前执行

总结

一共有以上4种方法将字符串改成函数

  • 异步: setTimeout()

  • 同步:eval() ,new Function(),script标签

 完整代码以及运行结果展示

// 1.多参数的函数,rest参数
Math.max(1,2,3,4);//4
Math.max(1,2,3,4,5,6,7,8,9,10)//10// Math.max()方法可以接受任意数量的参数,
// 类似扩展运算符...,rest参数也使用...符号,但它在定义函数时使用,表示将多余的参数收集到一个数组中。
function rest(a,b,...arg){// 使用rest 参数时,必须放在参数列表的最后console.log(arg);
}rest(1,2,3,4,5,6,7,8,9,10)//[3,4,5,6,7,8,9,10]// 对rest参数进行比较
function myMax(...args) {// 设置max接受最大值,初始值为第一个参数let max = args[0];// 遍历数组,如果当前值大于max,则将max设置为当前值args.forEach((item)=>{if(item>max){max=item;}})return max;
}
console.log(myMax(1,2,3,4,30,5,6,7,8,9,10));//30// 2.函数属性console.dir(function name(){})// name
function fn(){console.log(fn.name);return fn.name;
}fn();//fn
console.log(fn());//fn fn
console.log(fn.name);//fn// 对于赋值给变量的函数,函数本身是匿名的,函数name是变量名,
// 非匿名函数赋值,函数name是函数名
const f = function(){};
const fun = ()=>{}
const Fn = function F(){}console.log(f.name);//f
console.log(fun.name);//fun
console.log(Fn.name);//F// 没有name属性值
const fArr = [function(){}]
console.log(fArr[0].name);//''// length
function fa(a,b,c,...arg){console.log(fa.length);return fa.length;
}
console.log(fa.length);//3
fa(1,2,3,4,5,6,7,8,9,10);//3,和实参数量无关// 自定义函数属性function add(){  return add.count++;
}add.count = 0;
console.log(add(),add(),add(),add());//0 1 2 3// 使用内置变量的闭包
function count(){let sum = 0;return function (){return sum++;}
}
const addSum = count();console.log(addSum(),addSum(),addSum(),addSum());//0 1 2 3// 使用函数属性的闭包
function c(){c.count = 0;return function (){return c.count++;}
}
const addCount = c();console.log(addCount(),addCount(),addCount(),addCount());//0 1 2 3c.count = 20;
console.log(addCount());//20// 字符串生成函数let str = `function newFn(){console.log('这是eval改变字符串新生成的函数')
}`//eval()函数会将字符串作为JavaScript代码进行解析和执行
eval(str);
newFn();//这是eval改变字符串新生成的函数// new Function()() 也可以将字符串作为函数体进行解析和执行
new Function('console.log("这是new Function()改变字符串新生成的函数")')();//这是new Function()改变字符串新生成的函数
let newF= new Function('console.log("这是new Function()改变字符串新生成的函数")');
newF();//这是new Function()改变字符串新生成的函数// 使用setTimeout()函数
setTimeout(`(function newFn(){console.log('这是setTimeout()改变字符串新生成的函数')})()`
);//这是setTimeout()改变字符串新生成的函数// 使用script标签
const script = document.createElement('script');
script.innerHTML = `(function newFn(){console.log('这是script标签改变字符串新生成的函数')
})()`
document.body.appendChild(script);//这是script标签改变字符串新生成的函数

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

管理才是最根本的核心竞争力

相信大家对于华为提出的“管理是核心竞争力”“管理才是企业的核心竞争力”等言论并不陌生,而华为的确也一直践行这样的理念。比如,在华为发展历史上很艰难的2002年,华为仍然坚持重点抓管理。总裁任正非后来提到:“2002年华为快崩…

matplotlib下载安装

matplotlib下载安装过程同之前写的pygame很类似。 Pygame下载安装 python官网 1.搜索matplotlib 直接点进去 查看历史版本,因为新版本可能出现与python不匹配问题。 我选择3.6.3版本,因为我安装的python是3.8,可以匹配版本。同时window操…

价值499的从Emlog主题模板PandaPRO移植到wordpress的主题

Panda PRO 主题,一款精致wordpress博客主题,令人惊叹的昼夜双版设计,精心打磨的一处处细节,一切从心出发,从零开始,只为让您的站点拥有速度与优雅兼具的极致体验。 从Emlog主题模板PandaPRO移植到wordpres…

信创-系统架构师认证

随着国家对信息技术自主创新的战略重视程度不断提升,信创产业迎来前所未有的发展机遇。未来几年内,信创产业将呈现市场规模扩大、技术创新加速、产业链完善和国产化替代加速的趋势。信创人才培养对于推动产业发展具有重要意义。应加强高校教育、建立人才…

Infinitar链游新发展新机遇

区块链游戏市场在近年来经历了显著增长,吸引了大量的投资和关注。随着加密货币和NFT(非同质化代币)概念的普及,越来越多的投资者、游戏开发者和看到了区块链技术在游戏领域的应用潜力,纷纷涌入市场。区块链游戏的用户量…

CUDA编程基础

文章目录 1、GPU介绍2、CUDA程序进行编译3、CUDA线程模型3.1、一维网格一维线程块3.2、二维网格二维线程块3.3、三维网格三维线程块3.3、不同组合形式 4、nvcc编译流程5、CUDA程序基本架构6、错误检测函数6.1、运行时API错误代码6.2、检查核函数 7、CUDA记时7.1、记时代码7.2、…

知名品牌因商标痛失市场:114家直营店山寨店7000多家!

奶茶知名品牌“鹿角巷”当年红遍大江南北,是最早的新茶饮品牌,但是当年商标注册存在问题,被同行奶茶品牌抢占了先机,发声明“对大陆商标注册细则不详,在商标注册过程中让假店钻了法律空档”,最夸张的时候全…

python实践-实现TTS项目的应用

#coqui-ai TTS 项目地址# 版本: V0.22.0 博主使用的python版本:3.10.6 一、项目下载安装 下载: git或者直接下载都可 git clone https://github.com/coqui-ai/TTS.git 建议选择压缩包下载,选好对应版本。方便github会卡的小…

51单片机STC89C52RC——14.1 直流电机调速

目录 目的/效果 1:电机转速同步LED呼吸灯 2 通过独立按键 控制直流电机转速。 一,STC单片机模块 二,直流电机 2.1 简介 2.2 驱动电路 2.2.1 大功率器件直接驱动 2.2.2 H桥驱动 正转 反转 2.2.3 ULN2003D 引脚、电路 2.3 PWM&…

【刷题汇总--游游的you、腐烂的苹果、孩子们的游戏(圆圈中最后剩下的数)】

C日常刷题积累 今日刷题汇总 - day0051、游游的you1.1、题目1.2、思路1.3、程序实现 - 蛮力法1.4、程序实现 - 贪心(优化) 2、腐烂的苹果2.1、题目2.2、思路2.3、程序实现 - bfs 3、孩子们的游戏(圆圈中最后剩下的数)3.1、题目3.2、思路3.3、程序实现 -- 环形链表3.4、程序实现…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【生成密钥(C/C++)】

生成密钥(C/C) 以生成ECC密钥为例,生成随机密钥。具体的场景介绍及支持的算法规格。 注意: 密钥别名中禁止包含个人数据等敏感信息。 开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复…

(2024)KAN: Kolmogorov–Arnold Networks:评论

KAN: Kolmogorov–Arnold Networks: A review 公和众与号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 1. MLP 也有可学习的激活函数 2. 标题的意义 3. KAN 是具有样条基激活函数的 M…

基于Python爬虫的城市二手房数据分析可视化

基于Python爬虫的城市二手房数据分析可视化 一、前言二、数据采集(爬虫,附完整代码)三、数据可视化(附完整代码)3.1 房源面积-总价散点图3.2 各行政区均价3.3 均价最高的10个小区3.4 均价最高的10个地段3.5 户型分布3.6 词云图四、如何更换城市一、前言 二手房具有价格普…

《安全行业大模型技术应用态势发展报告(2024)》

人工智能技术快速迭代发展,大模型应用场景不断拓展,随着安全行业对人工智能技术的应用程度日益加深,大模型在网络安全领域的应用潜力和挑战逐渐显现。安全行业大模型技术的应用实践不断涌现,其在威胁检测、风险评估和安全运营等方…

idm下载慢怎么回事 idm批量导入下载使用方法

IDM (Internet Download Manager)是一款兼容性大,支持多种语言的下载管理软件,它可以自动检测并下载网页上的内容,这正是这一优点,使得它受到了广大用户的喜爱。在日常使用互联网的过程中,快速下载文件对我们来说非常重…

Patch SCN使用说明---惜分飞

软件说明 该软件是惜分飞(https://www.xifenfei.com)开发,仅用来查看和修改Oracle数据库SCN(System Change Number),主要使用在数据库因为某种原因导致无法正常启动的情况下使用该工具进行解决.特别是Oracle新版本中使用隐含参数,event,orad…

RH850系列芯片深度剖析 1.8-内存管理之MPU

RH850系列芯片深度剖析 1.8-内存管理之MPU 文章目录 RH850系列芯片深度剖析 1.8-内存管理之MPU一、MPU简介1.1 功能特性1.2 系统保护标识符(SPID)二、保护区域设置2.1 保护区域属性设置2.2 保护区域设置注意事项2.2.1 跨越保护区域边界2.2.2 无效的保护区域设置2.2.3 保护违规…

2-3 图像分类数据集

MNIST数据集是图像分类任务中广泛使用的数据集之一,但作为基准数据集过于简单,我们将使用类似但更复杂的Fashion-MNIST数据集。 %matplotlib inline import torch import torchvision # pytorch模型关于计算机视觉模型实现的一个库 from torch.utils i…

【Unity 人性动画的复用性】

Unity的动画系统,通常称为Mecanim,提供了强大的动画复用功能,特别是针对人型动画的重定向技术。这种技术允许开发者将一组动画应用到不同的角色模型上,而不需要为每个模型单独制作动画。这通过在模型的骨骼结构之间建立对应关系来…

【Odoo开源ERP】别把ERP与进销存软件混为一谈

导读:企业使用ERP软件能够实现管理升级,多方信息集成,按照既定策略逻辑运算,生成计划建议,减少人力成本,提高准确率的同时提高经营能力。 ERP,是MRP II的下一代软件,除了MRP II已有的…