Ala*_*anH 1 javascript underscore.js
我试图了解下划线的invoke()
功能,但在某些方面遇到了麻烦。这是带注释的源代码:
_.invoke = function(obj, method) {
var args = slice.call(arguments, 2);
var isFunc = _.isFunction(method);
return _.map(obj, function(value) {
var func = isFunc ? method : value[method];
return func == null ? func : func.apply(value, args);
});
};
Run Code Online (Sandbox Code Playgroud)
在此示例中:
_.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
=> [[1, 5, 7], [1, 2, 3]]
Run Code Online (Sandbox Code Playgroud)
我了解发生了什么事;但是,在源代码中,我不了解的功能args
。在哪种情况下需要使用其他参数?
我对编程也很陌生,我在为如何apply
使用这里而苦苦挣扎。我猜是因为我不完全了解的使用invoke
,即的使用args
。仍然,在查看Mozilla文档中提供的示例时,使用了一个示例Math.max.apply(*null*, numbers)
,那么为什么将其应用于value
源代码中?
如果您查看Underscore invoke
文档,则会看到以下内容:
methodName
在列表中的每个值上调用by命名的方法。传递给invoke的所有其他参数都将转发到方法调用。
你看?apply
和args
使用了所有魔术,因此您可以invoke
使用一些参数来触发该方法。
args
?看一下join
数组方法-它将元素连接到一个字符串中,如果我们传递某些东西-它将用作分隔符。
var things = ['apple', 'banana', 'mango'];
things.join('#') // 'apple#banana#mango'
Run Code Online (Sandbox Code Playgroud)
因此,join
可以接受争论。invoke
现在就使用它。
var manyThings = [
['apple', 'banana', 'mango'],
['pepsi', 'fanta', 'sprite'],
['bear', 'wolf', 'parrot']
];
// Pass '#' as a third argument - is like join('#')
console.log(_.invoke(arr, 'join', '#'));
// ["apple#banana#mango", "pepsi#fanta#sprite", "bear#wolf#parrot"]
Run Code Online (Sandbox Code Playgroud)
我们将“#”传递给该join
方法!当我们使用其他参数时就是这种情况。
怎么运行的?
var args = slice.call(arguments, 2);
Run Code Online (Sandbox Code Playgroud)
我们存储invoke
从第三个(第一个是列表,第二个是方法名称)开始传递给的所有参数。我们在manyThings
这种情况下存储“#” 。
invoke
我们传递的每个参数都methodName
将成为此methodName
函数的参数。
_.invoke(obj, 'methodName', '#', 2, false, '--')
// It's like do obj.methodName('#', 2, false, '--')
Run Code Online (Sandbox Code Playgroud)
的功能args
-存储传递的参数以在方法中使用它。
apply
?当我们拥有所有这些参数时,我们准备将它们传递给此处的方法:
var func = isFunc ? method : value[method];
Run Code Online (Sandbox Code Playgroud)
你看?我们承担了value[method]
职能。在此函数的深处使用this
。因此,为了能够使用正确的权限this
(manyThings数组)在正确的对象上触发该函数,我们需要apply
。然后,我们将args
第二个参数传递给apply
(在我们的示例中为“#”)。
这是如何运作的,希望您现在有所了解。