不正确的引用 this

简介: 不正确的引用 this

随着JavaScript编码技术和设计模式多年来变得越来越复杂,回调和闭包中的自引用作用域也相应增加,这是造成JavaScript问题的 "this/that 混乱 "的一个相当普遍的来源。

考虑下面代码:

Game.prototype.restart = function () {
    this.clearLocalStorage();
    this.timer = setTimeout(function() {
    this.clearBoard();    // What is "this"?
    }, 0);
};

执行上述代码会出现以下错误:

Uncaught TypeError: undefined is not a function

上述错误的原因是,当调用 setTimeout()时,实际上是在调用 window.setTimeout()。因此,传递给setTimeout()的匿名函数是在window对象的上下文中定义的,它没有clearBoard()方法。


传统的、符合老式浏览器的解决方案是将 this 引用保存在一个变量中,然后可以被闭包继承,如下所示:

Game.prototype.restart = function () {
    this.clearLocalStorage();
    var self = this;   // Save reference to 'this', while it's still this!
    this.timer = setTimeout(function(){
    self.clearBoard();    // Oh OK, I do know who 'self' is!
    }, 0);
};

另外,在较新的浏览器中,可以使用bind()方法来传入适当的引用:

Game.prototype.restart = function () {
    this.clearLocalStorage();
    this.timer = setTimeout(this.reset.bind(this), 0);  // Bind to 'this'
};
 
Game.prototype.reset = function(){
    this.clearBoard();    // Ahhh, back in the context of the right 'this'!
};
相关文章
|
存储 安全 编译器
C# 11.0中的泛型属性:类型安全的新篇章
【1月更文挑战第23天】C# 11.0引入了泛型属性的概念,这一新特性为开发者提供了更高级别的类型安全性和灵活性。本文将详细探讨C# 11.0中泛型属性的工作原理、使用场景以及它们对现有编程模式的改进。通过深入了解泛型属性,开发者将能够编写更加健壮、可维护的代码,并充分利用C#语言的最新发展。
|
Python
Python中的异步编程:使用asyncio和aiohttp实现高效网络请求
【10月更文挑战第34天】在Python的世界里,异步编程是提高效率的利器。本文将带你了解如何使用asyncio和aiohttp库来编写高效的网络请求代码。我们将通过一个简单的示例来展示如何利用这些工具来并发地处理多个网络请求,从而提高程序的整体性能。准备好让你的Python代码飞起来吧!
452 2
|
Cloud Native NoSQL 数据管理
现代化数据管理:面向未来的数据库技术发展
传统数据库技术已经不能满足当今大数据时代的需求,现代化数据库技术的发展成为了当务之急。本文将探讨面向未来的数据库技术发展方向,包括云原生数据库、图数据库、区块链技术在数据库领域的应用以及数据库安全性等方面。
|
Shell 数据处理 C++
【Shell 编程设计】shell中${}和()的使用指南
【Shell 编程设计】shell中${}和()的使用指南
309 0
|
人工智能 搜索推荐 云栖大会
什么是通义智文?AI阅读助手,用AI帮你读得多、读得快、读得懂
介绍通义智文产品发展历程、使用场景及主要功能。
52464 9
|
机器学习/深度学习 自然语言处理 算法
TASLP21-Reinforcement Learning-based Dialogue Guided Event Extraction to Exploit Argument Relations
事件抽取是自然语言处理的一项基本任务。找到事件论元(如事件参与者)的角色对于事件抽取至关重要。
285 0
|
JavaScript Java 数据安全/隐私保护
我把Github上最牛b的Java教程和实战项目整合成了一个PDF文档
大家都知道 Github 是一个程序员福地,这里有各种厉害的开源框架、软件或者教程。这些东西对于我们学习和进步有着莫大的进步,所以我有了这个将 Github 上非常棒的 Java 开源项目整理下来的想法。觉得不错的话,欢迎小伙伴们去star一波。
|
Java 容器
15JavaWeb基础 - JSP介绍
15JavaWeb基础 - JSP介绍
124 0
|
缓存 前端开发 JavaScript
前端性能中重要概念之性能优化方案
前端性能优化方案 在现代Web应用中,前端性能是非常重要的一环。在开发过程中,开发者需要寻找和实施各种前端性能优化方案,以提升应用的性能和用户体验。下面介绍一些常用的前端性能优化方案:
280 0
|
机器学习/深度学习 算法 C语言
C语言— —函数的递归与迭代问题
史上最全的C语言— —函数的递归与迭代问题
282 0
C语言— —函数的递归与迭代问题