最新要闻
- 半年劲销125万辆 比亚迪引领中国智造以实力出圈
- 铜仁石阡以“三资”管理监督“小切口”护航乡村振兴
- “福建土楼”申遗成功十五年:在保护与活化中传承
- 婴儿缺钙有什么表现和症状 婴儿缺钙最明显的征兆
- 拜登政府再调整移民政策 上万庇护被拒者有望返美
- 赵本山的徒儿有几个(赵本山五大直系徒孙
- 武汉力太7月7日聚醚市场快报
- 成绩揭晓!湖北省108名中小学青年教师同台竞技比武(附成绩表)
- 午评:上午大跌 下午又要大涨?
- 剧淘宝(ju taobao)
- 12代cpu值得等吗(12代cpu行不)
- 第十四届全国舞蹈展演在内蒙古鄂尔多斯举行
- 全球GDP前十五国家人均GDP排名
- 男子亮警官证让交警放行?深夜通报:情况属实
- 新疆阿克苏地区62万亩复播玉米陆续出苗 奠定丰产丰收基础
- 中国信通院宣布发起成立大模型生态合作共同体
手机
齐向东:数据安全出现了三大难题 “易攻难守”常态化
更换投保人需要顺利办理怎样的法律手续
- 齐向东:数据安全出现了三大难题 “易攻难守”常态化
- 更换投保人需要顺利办理怎样的法律手续
- 妲己toxic真名原名真人(妲己toxic真名)
- 半数菲律宾人对主权基金“不了解”
- 财政部相关负责人就美财政部部长耶伦访华答媒体询问
- 昝凌,航空工业机载系统的启明星
家电
js的中的函数(三)
方法
什么是js的方法?简单讲,绑定到对象的函数就是方法。
this
在对象的方法中,我们常常使用this关键字。this关键字代表方法所绑定的对象。
var wangqiang = { name : "wangqiang", age : 18, city : "guangzhou", address : "tianhe", //绑定到对象的函数叫方法 getBirth:function(){ let now = new Date(); return now.getFullYear() - this.age; } } wangqiang.getBirth(); //2005 var birth = wangqiang.getBirth; birth(); //NaN,脱离了绑定的对象。
上述代码所示,在方法getBirth()内部,我们用到了一个this关键字。这个关键字指向了绑定的对象,要正确执行方法,需要按照 obj.xxx()的方式才能正确地调用方法,保证方法绑定的对象,this的指向才能正确。
(相关资料图)
再看如下代码:
var lili = { name : "lili", age : 12, city : "beijing", address : "chaoyang", getBirth : function(){ let diff = function(year){ //超出了this的作用范围,this为undefined return year-this.age; } let now = new Date(); console.log(diff(2022)); return now.getFullYear() - this.age; } }
在getBirth方法中,我们有定义了一个匿名函数。在匿名函数不能再使用this,因为这时的this是undefined。我们可以在匿名函数外部用一个 变量接收this,在匿名函数内部再使用这个变量。也就是this对象不能跨越两层函数进行使用。
var lili = { name : "lili", age : 12, city : "beijing", address : "chaoyang", //方法的简写 getBirth(){ let that = this; let diff = function(year){ return year-that.age; } let now = new Date(); console.log(diff(2022)); return now.getFullYear() - this.age; } }
为此,可以在第一次函数里用一个变量that接收this,在第二层函数里再使用that,从而避免this变量不能跨越两层的障碍。
apply
函数通过apply方法,应用到对象上。
var xiaoli = { name : "xiaoli", age : 12, city : "beijing", address : "chaoyang", birth : getBirth } function getBirth(){ let now = new Date(); return now.getFullYear() - this.age; } xiaoli.birth(); getBirth.apply(xiaoli,[]);//应用到xiaoli对象上,参数数组为[] getBirth(); // Uncaught TypeError
另一个与apply()类似的方法是call(),唯一区别是:
- apply()把参数打包成Array再传入;
- call()把参数按顺序传入。
比如调用Math.max(3, 5, 4),分别用apply()和call()实现如下:
Math.max.apply(null, [3, 5, 4]); // 5 Math.max.call(null, 3, 5, 4); // 5
闭包
在JavaScript中,一个函数可以作为另外一个函数的参数进行传递。同样地,一个函数也可以作为另外一个函数的返回值。例如:
function lazy_sum(...rest){ return function sum(){ let reduce = rest.reduce(function(s,x){ return s += x; },6); return reduce; } } var lazy_sum1 = lazy_sum(1,2,4,6); var lazy_sum2 = lazy_sum(1,2,4,6); lazy_sum1(); //调用sum()函数,返回13 lazy_sum2(); //调用sum()函数,返回13 typeof lazy_sum1(); // 返回function typeof lazy_sum2(); // 返回function lazy_sum1 == lazy_sum2 // false
上述代码所示,调用lazy_sum1和lazy_sum2函数,它们都返回一个sum()函数。虽然返回的名称相同,但不同于数值的相等比较,它们并不相等。
看起来作用不大,只是可以延迟调用而已。再看下边的例子:
//闭包可以在函数内部封装一个变量 function wrap(initial){ initial = initial || 0; return function inc(){ initial += 1; return initial; } } var w = wrap(2); w(); //返回3 w(); //返回4 w(); //返回5
上述代码所示,wrap()是一个函数,它接收一个initial作为参数,这个函数的返回值也是一个函数,它是inc()。我们将inc()函数赋值给变量w, w函数调用一次返回3。接下来再调用一次,其内部的变量initial已经保留了3这个值,所以这时的返回值就是4。接下来的每次调用逻辑都是一致的。 这种在函数中封装了一个变量的函数形成了闭包。这种在函数中封装既封装了变量,又封装了方法的闭包,是不是有点像Java中的类呢?
闭包
ES6标准新增了一种新的函数:Arrow Function(箭头函数)。为什么叫Arrow Function?因为它的定义用的就是一个箭头:
x => x * x
使用规则
上面的箭头函数相相当于一个匿名函数:
function (x) { return x * x; }
箭头函数简化了函数定义。箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ ... }和return都省略掉了。 还有一种可以包含多条语句,这时候就不能省略{ ... }和return:
x => { if (x>0){ return x; }else{ return -x; } }
如果函数有多个参数,需使用括号,参数之间以逗号隔开
// 两个参数: (x, y) => x * x + y * y // 无参数: () => 3.14 // 可变参数: (x, y, ...rest) => { var i, sum = x + y; for (i=0; i < rest.length; i++) { sum += rest[i]; } return sum; }
如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:
// SyntaxError: x => { foo: x }
表达式的对象和函数体的{...}相冲突,需在对象外加上括号:
x => ({foo:x});
前面章节指出了对象方法上,this使用的注意事项:
var lili = { name : "lili", age : 12, city : "beijing", address : "chaoyang", getBirth(){ let diff = function(year){ return year-this.age; // this指向window或undefined }; let now = new Date(); return now.getFullYear() - this.age; } }
现在,箭头函数完全修复了this的指向,this总是指向词法作用域,也就是外层调用者obj:
var lili = { name : "lili", age : 12, city : "beijing", address : "chaoyang", getBirth(){ let diff = (year)=>year-this.age; // this指向lili let now = new Date(); return now.getFullYear() - this.age; } }
文章同时发表在:码农编程网欢迎访问
本节重点:
- 什么是方法,方法的调用;
- 注意对象方法内部的this指向,避免指向错误;
- apply,call的使用和区别;
- 定义一个返回类型为函数的函数;
- 如何形成闭包,闭包的使用;
- 什么是箭头函数,箭头函数的使用;
- 箭头函数修复了对象方法中的this指向。
关键词:
js的中的函数(三)
半年劲销125万辆 比亚迪引领中国智造以实力出圈
【双语财讯】澳大利亚旅游局启动品牌宣传活动 吸引中国游客
华夏阀门荣获省级"专精特新"企业称号
“宝马女司机醉驾撞人拖行案”一审宣判,判处6年3个月
海边人潮、啤酒狂欢、音乐盛宴……25°C青岛“热浪”来袭!
电动拖把引发火灾责任谁来担?
东旭光电(000413.SZ):目前消费电子终端需求出现复苏迹象,公司每月生产和交付随具体订单呈一定波动性变化
青春筑梦凉山 四川财经职业学院师生深入凉山开展暑期实践
安徽利辛县实施“秸秆变肉”工程 推动肉牛全产业链高质量发展
佳源创盛:再次延期披露2022年年度报告及2023年一季度财务报表,触发投资人保护条款
EA足球新作《FC24》售价和封面球员曝光!游戏将开启封测
权威部门话开局|教育部全力组织开展高校毕业生就业创业促进行动
*ST新纺(002087)7月7日主力资金净买入745.28万元
齐向东:数据安全出现了三大难题 “易攻难守”常态化
第十四届全国舞蹈展演在内蒙古鄂尔多斯举行
联想虚拟机蓝屏怎么解决
电脑摄像头蓝屏有哪些原因
赤壁安咀村来了群大学生
财政部:中美经贸关系的本质是互利共赢,贸易战、“脱钩断链”没有赢家
陕西省紫阳县发布高温黄色预警
醉驾撞人拖行2100米!湖南一宝马司机获刑6年3个月
华为与科大讯飞大模型合作正式亮相 全力打造我国通用智能新底座
民生银行济南舜华北路支行积极开展普及金融知识万里行活动
恒邦转债上市首日大涨触发临停 募投项目落地后将加速产能释放
2024年起,女科研人员申请“杰青”放宽到四十八岁
分享西红柿炒鸡蛋制作过程 ,难怪之前吃起来不嫩不香
公司问答|东风科技:公司有减速机相关产品,减速机产品已给东风启辰、东风乘用车等客户进行量产化交付
亚太主要股市全线下跌
铜仁石阡以“三资”管理监督“小切口”护航乡村振兴
安徽滁州:共建“毗邻区” “洼地”变“高地”
如何做强开放型经济?广信宁都主官今年有新动作
青海高速交警发布交通管制通告
“福建土楼”申遗成功十五年:在保护与活化中传承
泉为科技(300716)7月7日主力资金净买入1247.95万元
天禾股份(002999)7月7日主力资金净买入443.70万元
江苏一工人抢修电路疑似触电身亡
时隔22年,全球征集方案!郑州航空港,将迎大改变
多名富豪遇难!这家公司宣布:暂停运营!
不可原谅!马琳鲁莽决定付出代价,刘国梁失望,陈梦王曼昱不妙
花旗:维持中广核电力买入评级 目标价2.3港元
清华大学张亚勤:算力会是挑战 但不会卡人工智能的脖子
旋极信息:公司在晶体振荡器领域有相关布局
筑牢防灾减灾坚固防线
文班亚马为何和女星小甜甜发生冲突?他不该犯这错,韦德评价准确
人工智能大模型国家队正式组建!百度华为阿里入局
科普视频|路遇晕倒你别慌,四字诀窍帮你忙
甘肃努力构建现代农业社会化服务体系
国家卫生健康委成立医疗应急工作专家组 涉22个学科
东莞中考录取分数线是多少(2020-2023)
天津市中考志愿查询辅助系统2023
恭喜!詹姆斯教练生涯首胜,二儿子三分犀利,湖人冠军控卫也立功
到国家队观摩学习!杨鸣:受益匪浅 预祝男篮比赛圆满成功
实验操作I 免疫荧光详细操作来啦
原神蔓生溪谷北礼券收集攻略-原神蔓生溪谷北礼券分布一览
更换投保人需要顺利办理怎样的法律手续
上海交响乐团、纽约爱乐乐团等联合委约清唱剧《上海!上海!》
婴儿缺钙有什么表现和症状 婴儿缺钙最明显的征兆
肿脖子
拜登政府再调整移民政策 上万庇护被拒者有望返美
吉利汽车上半年销量69.4万台!新能源产品增长44%
夜花姐原唱(夜姐是什么)
怎么查询自己的手机号(怎么查询自己的手机号注册过哪些平台?)
妲己toxic真名原名真人(妲己toxic真名)
赵本山的徒儿有几个(赵本山五大直系徒孙
上海正式放弃追求周琦!北京已上桌,寻求交易得到周琦,希望不大
耶伦到访,马斯克提醒!
再见哈登!湖人、76人、公牛商讨三方交易,德罗赞空降洛杉矶?
《原神》哐哐当当雀雀球第一天通关攻略
【国际漫评】这个生日真糟心!
学生信息泄露不只在人大,网上最低1元就能买到200条
喜茶、奈雪……奶茶品牌为何纷纷扎堆小县城?
2023WAIC探索创新 智汇未来|长三角绿洲智谷·赵巷携手园区企业 共绘智慧产城实景图
空客6月交付72架飞机,年内累计交付量达316架
中国百强城市2023排名公布:北京、上海、香港居前三
专访德国汉堡大学海洋研究所副所长Notz:北极恐最早在2030年出现第一个“无冰之夏”
美国防部发言人:美国目前缺乏镓储备
开了直通车为啥没有hot?没展现咋回事?
武汉力太7月7日聚醚市场快报
学习时节|“历史是最好的教科书,也是最好的清醒剂”
半数菲律宾人对主权基金“不了解”
花大钱报志愿 不值!
原神丘丘水行游侠详细介绍 具体一览
哈萨克斯坦举行首届国际军乐节 中国乐曲受欢迎
NASA即将开始X-59研究机地面试验
开心消消乐 x ToBid聚合|千万级DAU游戏变现攻略
港股异动 | 华南职业教育(06913)盘中涨超8% 政策大力支持产教融合发展
减速器概念尾盘持续下挫 中马传动触及跌停
推进人工智能与医疗健康融合,上海将开发适用于生命科学的大模型
荷兰乳企深耕中国市场
成绩揭晓!湖北省108名中小学青年教师同台竞技比武(附成绩表)
财政部相关负责人就美财政部部长耶伦访华答媒体询问
财政部相关负责人就美财政部部长耶伦访华答媒体询问
产前、产中、产后全链条服务,稳粮增收底气足
数字经济潜力加快释放 2016年至2022年年均复合增长14.2%
“光伏+”开辟中国清洁能源发展新赛道
威刚首款PCIe 5.0 SSD发布:性能强 1TB/2TB容量可选
出行没有七天无理由退货 聚合平台不能罔顾安全
排名前十的农用杀虫剂
进口水果调查:电商售卖名录之外水果多是国产