如何理解下划线的调用

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源代码中?

注意:我已经阅读了许多关于thisthisthis以及其他视频的文章,但是仍然很挣扎。

Ale*_*nko 5

如果您查看Underscore invoke文档,则会看到以下内容:

methodName在列表中的每个值上调用by命名的方法。传递给invoke的所有其他参数都将转发到方法调用

你看?applyargs使用了所有魔术,因此您可以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(在我们的示例中为“#”)。

这是如何运作的,希望您现在有所了解。

  • 我们可以传递`methodName`或函数。因此,在三进制中,我们检查-如果我们通过函数,则按原样使用它。如果我们传递的不是函数-像字符串'sort',我们假设它是一个方法名,那么我们从对象`value`中选择它。并且这个对象-从当前的迭代到集合,我们传递以进行初始调用。 (2认同)