怎么来
var a = "foo / bar/ baz ".split('/');
a.map( function (e) { return String.prototype.trim.call(e) } )
有效,但这并不......
a.map( String.prototype.trim );
答案 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
未绑定到任何对象。