在Javascript中使用Array.map和提升函数

时间:2015-01-05 09:30:27

标签: javascript function ecmascript-5

怎么来

var a = "foo /    bar/  baz  ".split('/');

a.map( function (e) { return String.prototype.trim.call(e) } )

有效,但这并不......

a.map( String.prototype.trim );

3 个答案:

答案 0 :(得分:1)

试试这个:

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)
像那样。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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