JS中箭头函数的不能使用场景有哪一些
Admin 2022-07-20 群英技术资讯 977 次浏览
这篇文章主要介绍了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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
JavaScript 函数提供两个接口实现与外界的交互,其中参数作为入口,接收外界信息;返回值作为出口,把运算结果反馈给外界。下面本篇文章带大家了解一下JavaScript函数返回值,浅析下return语句的用法,希望对大家有所帮助!
这篇文章主要介绍vue数据双向绑定原理以及如何实现一个简易版的数据双向绑定,下面内容会比较详细的分析每一步的问题以及代码,所以对于vue源码初学者有一定的学习参考价值。对vue源码学习感兴趣的朋友继续往下看吧。
jQuery中的$符号表示什么?日常中我们看到$符号是表示美元的符号,但是在jQuery中$符号是代表获取的意思,是一个回传函数。这篇我们就来了解看看$符号怎么样使用。
目录vue控制mock在开发环境使用,在生产环境禁用说下原因解决方案vue中使用mock(常用方式)前期准备安装axios和mock.js插件在main.js中引入编写mock.js调用成功vue控制mock在开发环境使用,在生产环境禁用说下原因mock拦截所有的axios请求,根据请求,做出相应的响应。平时前后端分离
本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了JavaScript的书写规则、变量的声明格式、变量的命名规则、及注意事项,变量的数据类型,数据类型的分类,空(null) 与 未定义(undefined)的用法,下面一起来看一下,希望对大家有帮助。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
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核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008