1

我认为问题不在于 underscore.js,而在于 Native 原型函数。似乎只能直接调用它们,而不能将它们作为回调传递。这是我不能使用的代码和我的测试中的错误(使用 Mocha.js,仅相关部分):

_.chain("INPUT").tap(String.prototype.toLowerCase)
// => TypeError: String.prototype.toLowerCase called on null or undefined

所以在 Node 的 REPL 中尝试了这个:

String.prototype.toLowerCase("INPUT")
// => ''

我知道应该用.callor调用原型的函数.apply,但究竟为什么呢?以及如何将此函数作为回调传递?

4

2 回答 2

2

原型方法在this内部使用来引用应该被操作的对象。

callapply允许您this在调用函数时指定值。

String.prototype.toLowerCase.call('INPUT'); //input

如果您想将一个this值绑定到一个函数,以便它的调用形式无关紧要,您可以使用_.bindor来完成Function.prototype.bind

var lowerCaseInput = String.prototype.toLowerCase.bind('INPUT');

lowerCaseInput(); //input

现在,调用_.chain一个对象会将它包装在一个下划线对象中并返回包装器,_.tap并将链中前一个函数的结果作为输入。在这里,我们看到它不会起作用,因为String.prototype.toLowerCase甚至不需要争论。

不仅如此,字符串也是不可变的,因此您必须执行以下操作:

_.chain({ text: 'INPUT' }).tap(function (obj) {
    obj.text = obj.text.toLowerCase();
}).value().text;
于 2013-10-22T12:22:58.633 回答
0

此外,如果您使用 mixins,您可以使用mixin简单包装toLowerCase.

_.mixin({
    toLowerCase: function(str) {
        // Add here any desired validation if wanted
        return str.toLowerCase();
    }
}, {
    chain: false
});

之后,您可以执行以下操作:

_.chain('HELLO_WORLD')
    .toLowerCase()
    .replace('_',' ')
    .value()
于 2016-08-18T19:18:05.337 回答