Array.map 和 Javascript 中的提升函数

Array.map and lifted functions in Javascript

本文关键字:函数 map Javascript Array      更新时间:2023-09-26

怎么来了

var a = "foo /    bar/  baz  ".split('/');
a.map( function (e) { return String.prototype.trim.call(e) } )

有效,而这不...

a.map( String.prototype.trim );

试试这个:

a.map(Function.prototype.call.bind(String.prototype.trim ))

之所以这样做而只是映射String.prototype.trim不起作用,是因为正如其他人指出的那样,当函数尝试修剪数组元素时,this将未定义。这个解决方案的作用是,它创建一个新函数,该函数将this值作为函数String.prototype.trim。由于新函数是Function.prototype.call的修改版本,因为map称这个函数传递给数组元素,本质上执行的是:Function.prototype.call.call(String.prototype.trim, element) 。这会在传入的元素上运行函数String.prototype.trim,您将获得修剪后的结果。这也将起作用:

 a.map(Function.call, "".trim)

通过利用第二个参数map接受thisArg的事实.对于一点点语法糖,你可以创建一个看起来像这样的函数:

Array.prototype.mapUsingThis = function(fn) { return this.map(Function.call, fn); };

然后,您可以调用

a.mapUsingThis("".trim)

诸如此类。

String.prototype.trim 是一个非参数函数,它将由字符串本身调用,但映射函数需要一个 func arg 接受 str 作为参数

'this'在第

一种情况下引用字符串参数,而在第二种情况下,"this"变得未定义,因为String.prototype.trim未绑定到任何对象。