Array.prototype.map.call(arr,this.parse)
对于上面的代码,我正在做的是我在数组this.parse
上应用arr
,其中this.parse
我在函数上使用了一些(例如,this.func1
)
尽管如此,我在调用this
时丢失了this.func1
,它似乎指向全局对象而不是当前类。保留this
的正确方法是什么?
更新 正如下面的答案所示,我使用
arr.map(this.parse.bind(this))
它有效!谢谢!
答案 0 :(得分:4)
您可以将this.parse
绑定到当前this
。请记住,this
不是词法范围,它取决于函数的调用方式。 Function.bind可让您指定this
无论如何被称为<{1}}
Array.prototype.map.call(arr, this.parse.bind(this));
另一个选项是要解析的第二个可选参数,它允许您指定this
的内容。见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
Array.prototype.map.call(arr, this.parse, this);
另一个选择是使用箭头函数,它使用词法范围this
。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
Array.prototype.map.call(arr,
(current, index, array) => this.parse(current, index, array));
答案 1 :(得分:2)
我只是假设你使用的是Typescript,因为你用“typescript”标记了帖子。我们来看看你写的内容:
Array.prototype.map.call(arr,this.parse)
为什么你首先使用call()?有什么理由吗?你写的相当于:
arr.map(this.parse)
来自Mozilla的reference on the Array.map()函数:
arr.map(回调[, thisArg ])
如果提供了thisArg参数进行映射,则会在调用时将其传递给回调,以用作其此值。否则,将传递未定义的值以用作其此值。最终可通过回调观察到的值根据用于确定函数所见的通常规则来确定。
我认为您真正想做的是捕获当前对象的此上下文。如果您只引用函数的名称,Typescript将不会这样做,因为Javascript不会这样做而且Typescript努力向后兼容现有的Javascript。
我认为你想要做的是这样的事情:
private parse(str: string): string {
// Just an example -- parse by converting to uppercase
return str.toUpperCase();
}
public myMethod(arr: string[]) {
// Parse all the elements of arr
let parsedArray = arr.map((elem) => this.parse(elem));
// ...
}