我是 Javascript 新手,只是想确保我理解它如何处理this
关键字,因为……嗯,看起来很混乱。我已经在 StackOverflow 上查看了类似的问题,并想确保我没有继续错误的想法。
所以我定义一个像这样的类,并且想要处理构造函数中收到的每个点。
function Curve(ptList) {
this.pts = [];
if(ptList.length > 2) {
// I want to call "addPoint" for every item in ptList right here
}
}
Curve.prototype.addPoint = function(p) {
this.pts.push(p);
/* some more processing here */
}
所以,最初我想我可以这样做:
ptList.forEach(this.addPoint);
但我不能,因为这只是传递一个指向原型函数的指针,这意味着this
in addPoint
指的是全局对象。
然后我尝试:
ptList.forEach(function(p) { this.addPoint(p); });
但我不能,因为this
一旦我进入该内部函数,就指的是全局范围(它不再指的是Curve
正在构造的对象),所以addPoint
未定义。
解决这个问题的方法是创建一个引用的变量this
在我仍然可以在子功能中交谈的范围内:
var _this = this;
ptList.forEach(function(p) { _this.addPoint(p); });
这最终起作用了(但对于没有 JS 经验的人来说看起来真的很奇怪)。但后来我发现bind
函数,这让我不能定义一个简单的函数包装器:
ptList.forEach(this.addPoint.bind(this));
最后,这似乎是最好、最简洁的方法,尽管它看起来很愚蠢。如果没有bind
功能,addPoint
不知道它被调用的是哪个对象,并且没有第一个this
,我什至找不到我的addPoint
功能。
有没有更好的方法来完成这个看似简单的事情,或者最后一行代码是推荐的方法吗?