JS中箭头函数的不能使用场景有哪一些
Admin 2022-07-20 群英技术资讯 840 次浏览
这篇文章主要介绍了JS中箭头函数的不能使用场景有哪一些相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JS中箭头函数的不能使用场景有哪一些文章都会有所收获,下面我们一起来看看吧。JS 中对象方法的定义方式是在对象上定义一个指向函数的属性,当方法被调用的时候,方法内的 this 就会指向方法所属的对象。
let obj = {
array: [1, 2, 3],
sum: () => {
console.log(this === window); // true
return this.array.reduce((result, item) => result + item);
}
};
console.log(this === window); //true
obj.sum();//报错:Uncaught TypeError: Cannot read property 'reduce' of undefined at Object.sum
运行时 this.array 是未定义的,调用 obj.sum 的时候,执行上下文里面的 this 仍然指向的是 window,原因是箭头函数把函数上下文绑定到了 window 上,this.array 等价于 window.array,显然后者是未定义的。
修改方式:使用函数表达式或者方法简写(ES6 中已经支持)来定义方法,这样能确保 this 是在运行时是由包含它的上下文决定的。代码如下:
let obj = {
array: [1, 2, 3],
sum() {
console.log(this === window); // false
return this.array.reduce((result, item) => result + item);
}
};
console.log(this === window); //true
console.log(obj.sum());//6
同样的规则适用于原型方法(prototype method)的定义,使用箭头函数会导致运行时的执行上下文错误。比如下面代码:
function Cat(name) {
this.name = name;
}
Cat.prototype.sayCatName = () => {
console.log(this === window); // => true
return this.name;
};
const cat = new Cat('Tom');
console.log(cat.sayCatName()); // undefined
使用传统的函数表达式就能解决问题,代码如下所示:
function Cat(name) {
this.name = name;
}
Cat.prototype.sayCatName = function () {
console.log(this === window); // => false
return this.name;
}
const cat = new Cat('Tom');
console.log(cat.sayCatName()); // Tom
sayCatName 变成普通函数之后,被调用时的执行上下文就会指向新创建的 cat 实例。
箭头函数在声明的时候就绑定了执行上下文,要动态改变上下文是不可能的,在需要动态上下文的时候它的弊端就凸显出来。
比如在客户端编程中常见的 DOM 事件回调函数(event listenner)绑定,触发回调函数时 this 指向当前发生事件的 DOM 节点,而动态上下文这个时候就非常有用,比如下面这段代码试图使用箭头函数来作事件回调函数。
const button = document.getElementById('myButton');
button.addEventListener('click', () => {
console.log(this === window); // true
this.innerHTML = 'Clicked button';
});
在全局上下文下定义的箭头函数执行时 this 会指向 window,当单击事件发生时,this.innerHTML 就等价于 window.innerHTML,而后者是没有任何意义的。
使用函数表达式就可以在运行时动态的改变 this,修正后的代码:
const button = document.getElementById('myButton');
button.addEventListener('click', function () {
console.log(this === button); // true
this.innerHTML = 'Clicked button';
});
构造函数中的 this 指向新创建的对象,当执行 new Car() 的时候,构造函数 Car 的上下文就是新创建的对象,也就是说 this instanceof Car === true。显然,箭头函数是不能用来做构造函数, 实际上 JS 会禁止你这么做,如果你这么做了,它就会抛出异常。
比如下面的代码就会报错:
const Message = (text) => {
this.text = text;
};
const helloMessage = new Message('Hello World!');//报错: Throws "TypeError: Message is not a constructor"
构造新的 Message 实例时,JS 引擎抛了错误,因为 Message 不是构造函数。可以通过使用函数表达式或者函数声明来声明构造函数修复上面的例子。
const Message = function(text) {
this.text = text;
};
const helloMessage = new Message('Hello World!');
console.log(helloMessage.text); // 'Hello World!'
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家详细介绍了vue实现列表无缝滚动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在Excel中,我们可以通过拖拉表格来实现自动计算表格的内容,那么我们做网页版的Excel表格,这个功能要如何实现呢?接下来小编就给大家分享用JavaScript实现拖拉表格自动计算内容的功能。
我们都知道form表单中有一个默认的reset重置表单事件,你一定会很熟悉,后面我也会对reset事件使用详细解释,请先看下面的代码。 inputtype=reset 为什么有了reset按钮了,我们还要使用js或jquery来实现reset事件呢?这是因为有时候我们form表单提交完数据之
在web开发中我们可能会遇到页面局部刷新的需求,那么我们要如何来实现呢?这篇文章就给大家分享一下ajax+jquery实现页面某一个div刷新效果的实例代码,希望大家理解和学习页面局部刷新的知识有所帮助。
目录vue判断安卓还是IOS最近工作上遇到这样一个需求所以我们需要进行一个判断H5端判断安卓跟ios显示不同的背景图vue判断安卓还是IOS最近工作上遇到这样一个需求vue写的页面,需要同时跟安卓和ios进行交互;若是安卓,执行代码:android.finishActivity();若是IOS,执行代码:try {
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008