常见错误一:对于this关键词的不正确引用
最后更新于:2022-04-01 01:49:11
我曾经听一位喜剧演员说过:
**“我从未在这里,因为我不清楚这里是哪里,是除了那里之外的地方吗?”**
这句话或多或少地暗喻了在js开发中开发者对于this关键字的使用误区。This指代的是什么?它和日常英语口语中的this是一个意思吗?
随着近些年js编程不断地复杂化,功能多样化,对于一个程序结构的内部指引、引用也逐渐变多起来
下面让我们一起来看这一段代码:
~~~
Game.prototype.restart = function () { this.clearLocalStorage();
this.timer = setTimeout(function(){ this.clearBoard(); }, 0);
};
~~~
运行上面的代码将会出现如下错误:
~~~
Uncaught TypeError: undefined is not a function
~~~
这是为什么?this的调用和它所在的环境密切相关。之所以会出现上面的错误,是因为当你在调用 setTimeout()函数的时候, 你实际调用的是window.setTimeout(). 因此,在 setTimeout() 定义的函数其实是在window背景下定义的,而window中并没有 clearBoard() 这个函数方法。
下面提供两种解决方案。第一种比较简单直接的方法便是,把this存储到一个变量当中,这样他就可以在不同的环境背景中被继承下来:
~~~
Game.prototype.restart = function () { this.clearLocalStorage();
var self = this;
this.timer = setTimeout(function(){ self.clearBoard();}, 0); };
~~~
第二种方法便是用bind()的方法,不过这个相比上一种要复杂一些,对于不熟悉bind()的同学可以在微软官方查看它的使用方法:[https://msdn.microsoft.com/zh-cn/library/ff841995](https://msdn.microsoft.com/zh-cn/library/ff841995)
~~~
Game.prototype.restart = function () { this.clearLocalStorage();
this.timer = setTimeout(this.reset.bind(this), 0); };
Game.prototype.reset = function(){ this.clearBoard();};
~~~
上面的例子中,两个this均指代的是Game.prototype。