最新要闻
- 援外日记丨非洲同行们总是对我说,廖医生谢谢你
- 老百姓需要买百万医疗吗?需要买几年?
- 巨量千川保障期什么意思
- 精锻科技:预期宁波工厂今年扭亏 明年电磁阀产品等放量
- 招商银行零售小微贷款余额突破7000亿元
- 佳禾食品(605300.SH):其他类产品基本是公司自有品牌
- 长丰县公安局吴山派出所抓获一名盗窃嫌疑人
- 皮皮虾怎么剥皮方便 ?皮皮虾身上的有个神秘小“开关”,找到它,剥壳既轻松又完整
- KargoBot自动驾驶卡车超百台,新能源占比超60%
- 保利置业上半年合同销售374亿元,同比增长127%
- 图片报:那不勒斯有意板仓滉 门兴无非卖品&2000万欧报价能赚钱
- “厨房里的人类学家”罗朗:用味道打造记忆锚点,用烹饪存储美好回忆
- 电力股冲高 稀土永磁板块继续调整丨就市论市
- 进口水果调查:电商售卖名录之外水果多是国产
- 不管怎么样,还有书啊
- 最新!5户央企领导人员调整
手机
一张图:2023/07/07黄金原油外汇股指"枢纽点+多空占比"一览
跑赢99% 同行的韩国Asset Plus基金:小型芯片材料和设备供应商迎买入良机
- 一张图:2023/07/07黄金原油外汇股指"枢纽点+多空占比"一览
- 跑赢99% 同行的韩国Asset Plus基金:小型芯片材料和设备供应商迎买入良机
- “中特估”下半年还有哪些投资机会?机构最新研判
- 内容正在升级改造,请稍后再试!
- 中国首笔“数字人民币+TIPS海关实时扣税”业务落地
- 成都锦和康城锦绣苑保租房有哪些户型?
家电
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的中的函数(三) 前沿热点
曲靖首店!DJI大疆官方授权体验店落地曲靖万达!
2023Q1 中国市场折叠屏手机出货量大增 华为 OPPO 三星成赢家
援外日记丨非洲同行们总是对我说,廖医生谢谢你
2000万辆,意味着什么?
促销福利多、市场潜力大 “绿色+智能”家电成消费新选择
全球6月造船订单量同比减少49% 中国新船订单量继续居首
驻马店市诸市镇:村中有个制衣厂 乡村振兴产业旺
知名港星母亲与家人庆生!被指长相与狄龙太相似,家族出多位明星
国际友人打卡武陵胜景:叹服大自然鬼斧神工
2023年浙江金华市高考录取结果什么时候查询?
一张图:2023/07/07黄金原油外汇股指"枢纽点+多空占比"一览
跑赢99% 同行的韩国Asset Plus基金:小型芯片材料和设备供应商迎买入良机
茅台旗下公司新增百货销售业务
老百姓需要买百万医疗吗?需要买几年?
工信部等调整新能源车型积分计算方法,分值平均下调40%
巨量千川保障期什么意思
原神3.8版本能获取多少原石
江西鹰潭公积金政策调整 取消按月抵冲和按年提取还贷二选一政策
基金走势图怎么看 方法如下
联想预热拯救者 Y9000X 2023 笔记本:全身电泳白工艺 颜值爆表!
用陪伴、探索、行动呵护首善人生——亲人请就位,2023北京人寿亲人节启航
599元!新型电竞显示器推出 144Hz刷新率
*ST中捷7月7日加速下跌
有关体育锻炼的演讲稿(关于体育锻炼的演讲稿)
《网络暴力信息治理规定(征求意见稿)》:网络信息服务提供者应当提供一键关闭陌生人私信、评论、转发和消息提醒等设置
内蒙古鄂托克前旗:搭建“数字乡村”小舞台 奏响“乡村振兴”大合唱
10个维度,摸底券商研报业务
刚刚!江都发布最新雨情通报,最大降雨319.4毫米,在这个镇……
人保财险签发全国首单“天然气余压利用保险”
精锻科技:预期宁波工厂今年扭亏 明年电磁阀产品等放量
“中特估”下半年还有哪些投资机会?机构最新研判
重庆药监公布医疗器械不合格名单,涉河南艾尔乐等9家企业
南京市气象台发布雷暴大风黄色预警信号
这5种食物是天然“防晒霜”!
乌鲁木齐哪家医院男科好-乌鲁木齐市割包皮需要多少钱
IDC:2022年中国RPA+AI市场规模为 3.1亿美元 同比增长19.2%
招商银行零售小微贷款余额突破7000亿元
佳禾食品(605300.SH):其他类产品基本是公司自有品牌
广州南沙多举措促制造业数字化转型
积极拓展新能源汽车电驱动领域 威迈斯正式启动招股
鞍钢股份新设产业发展子公司,注册资本4.69亿
恒帅股份:招商证券、兴业证券等多家机构于7月7日调研我司
澳门银河莱佛士酒店8月16日正式开启试营业
中方呼吁美国等各方推动伊核问题全面协议早日重返正轨
外媒:“泰坦”号潜水器运营公司宣布暂停运营
《百变大侦探》飘翎远凶手解析
内容正在升级改造,请稍后再试!
南矿集团(001360):该股换手率大于8%(07-07)
小米汽车动态:供应商透露进展,已完成报价,离上市越来越近了
造车新势力期中考:理想狂奔,蔚来、小鹏“掉链子”,问界已“扶不上墙”?
未来十天厦门将出现持续高温
联想二合一蓝屏怎么办
“梅姑娘”今夜带来雷电+暴雨+大风,奉贤周末最高温降至30℃附近
外请内联,集智聚力解油田一线难题
Redmi 平板跌破 800 元,90Hz 高刷 2K 屏
中国首笔“数字人民币+TIPS海关实时扣税”业务落地
长丰县公安局吴山派出所抓获一名盗窃嫌疑人
潞城区神头村:红色引擎强劲乡村振兴动能
审批最快、成本最低、服务最优……盐城建湖制定优化营商环境行动方案
皮皮虾怎么剥皮方便 ?皮皮虾身上的有个神秘小“开关”,找到它,剥壳既轻松又完整
西十高铁汉江特大桥进入主梁施工阶段
东风科技:公司有减速机相关产品,减速机产品已给东风启辰、东风乘用车等客户进行量产化交付
晋拓股份7月7日加速下跌
创意制作绿野仙踪魔杖道具为圣诞节送上惊喜礼物
天天讲安全|戴上VR眼镜,手握操作柄……一场特别的安全教育课在海平高速建设工地“开讲”
暑期演出“旺季”来临 7-8月演出项目超8000个
KargoBot自动驾驶卡车超百台,新能源占比超60%
x86、ARM垄断CPU 倪光南院士:中国超大规模优势可支撑RSIC-V生态
“有”字型排比句40例1.既有大格局、又有强功能的完备形态,既有
成都大运会羽毛球比赛门票什么时候可以买?
成都锦和康城锦绣苑保租房有哪些户型?
小黄人跑酷的游戏叫什么名字_小黄人天天酷跑电脑版
奇瑞集团6月销量145235辆,但虎7已取代虎8成为销量“一哥”
华达新材:人民币贬值对公司经营有一定的正面影响
保利置业上半年合同销售374亿元,同比增长127%
7个小时1000万用户,扎克伯格真要“干翻推特”了?
博时中债1-3政金债指数迎来2023年度的第2次分红,7月11日除权
强力拆违 推进东吴路全线贯通
排位赛怎么打胜率高(排位赛怎么打)
罗博特科:参股公司ficonTEC已向国际级硅光工艺平台提供设备
荷兰名记:曼联签奥纳纳接近达协议,转会费5500万欧签约5年或4+1
招行金葵花金卡年费 招商银行金葵花卡年费
图片报:那不勒斯有意板仓滉 门兴无非卖品&2000万欧报价能赚钱
可叹,可惜,这些TOP100男子选手,无法征战2023年温网(完)
陕西省陇县发布高温黄色预警
南非亚洲及金砖事务特使:越来越多国家寻求加入金砖国家
“厨房里的人类学家”罗朗:用味道打造记忆锚点,用烹饪存储美好回忆
电力股冲高 稀土永磁板块继续调整丨就市论市
企业筹划税收(关于企业筹划税收的基本详情介绍)
北京华夏心理咨询热线_北京华夏心理
进口水果调查:电商售卖名录之外水果多是国产
一张团购券要分三次使用 探店博主和商家都未说明规则
“富德心服务”2.0升级:用“心”做服务,用“数”做价值
北京双双名列前茅
美柚是什么意思网络用语(美柚是什么)
电话号码归属查询怎么查(电话号码归属查询)
谁能攻克抑郁症?
险资运用余额加速增长 债券配置比例达近九年新高
彩生活停牌归来 还清所有有息负债