在调用数组的map函数时丢失了这个

时间:2015-11-12 12:45:11

标签: javascript typescript

Array.prototype.map.call(arr,this.parse)

对于上面的代码,我正在做的是我在数组this.parse上应用arr,其中this.parse我在函数上使用了一些(例如,this.func1

尽管如此,我在调用this时丢失了this.func1,它似乎指向全局对象而不是当前类。保留this的正确方法是什么?

更新 正如下面的答案所示,我使用

arr.map(this.parse.bind(this))

它有效!谢谢!

2 个答案:

答案 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);

另一个选择是使用箭头函数,它使用词法范围thishttps://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));

    // ...
}