如果我有一个表示数字的字符串数组,并希望将数组中每个条目的类型转换为数字,我可以使用map
:
var stringNumbers = ["11", "23", "5813"];
stringNumbers.map(parseFloat);
// [11, 23, 5813]
这是有效的,因为parseFloat
可以全局访问。但是,如果我想要对象方法的结果,我似乎需要使用匿名函数。
var Dog = function(name) {
this.name = name;
};
Dog.prototype.getName = function() {
return this.name;
};
var dogs = [new Dog("Beatrice"), new Dog("Baxter")];
dogs.map(function(dog) {
return dog.getName();
});
// ["Beatrice", "Baxter"]
理想情况下,我可以做类似的事情:
dogs.map(getName); // ["Beatrice", "Baxter"]
但这不起作用,因为getName不可全局访问。
有没有办法将map
执行的每个函数绑定到它迭代的对象的上下文?
答案 0 :(得分:4)
技术上 IS 可以作为
var r = dogs.map(Function.prototype.call.bind(Dog.prototype.getName));
JSFiddle:http://jsfiddle.net/VCvp7/
说明:
Function.prototype.call.bind(Dog.prototype.getName)
返回一个等于Dog.prototype.getName.call
的函数引用,它期望第一个参数作为上下文(在调用this
期间使用的getName
值),这就是{ {1}}将确切的map()
实例传递给。
PS :对不起,无法解释得更好。如果你没有得到它 - 只需花费几分钟就可以搞清楚。
答案 1 :(得分:1)
如果我的项目中有下划线库,我会使用invoke:
// Use _.invoke to call method getName() on each dog in dogs
var dogNamesInvoke = _.invoke(dogs, 'getName');
// ["Beatrice", "Baxter"]
但是也意识到你可以传递第二个参数来映射thisArg。
// Use Array.map but pass the function name 'getName' as the 2nd parameter to map
var dogNamesMap = dogs.map(function(value) {
var functionName = this;
return value[functionName].apply(value);
}, 'getName');
// ["Beatrice", "Baxter"]
以下是link to a Plunker,其中显示了您的原始代码以及其他两个选项。