Javascript 迭代对象值实际在何处/如何执行?

Javascript 迭代对象值实际在何处/如何执行?,javascript,underscore.js,Javascript,Underscore.js,我正在使用下划线.js扩展我对更复杂javascript概念的知识和理解,并希望有人能帮助我理解在特定示例中如何执行u.iteratee函数 下面就是这个例子,并对我迄今为止的理解进行了评论 我使用的u.map函数如下所示: _.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; }); => [3, 6, 9] 最底层是正在使用的相关函数,一些无关紧要的函数,如u.键被忽略 我的理解是: 在u.map函

我正在使用下划线.js扩展我对更复杂javascript概念的知识和理解,并希望有人能帮助我理解在特定示例中如何执行u.iteratee函数

下面就是这个例子,并对我迄今为止的理解进行了评论

我使用的u.map函数如下所示:

_.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; });
=> [3, 6, 9]
最底层是正在使用的相关函数,一些无关紧要的函数,如u.键被忽略

我的理解是:

在u.map函数中,函数体中iteratee的第一个实例的设置如下:iteratee=u.iterateeiteratee,context;它基于u.iteratee函数,因为函数正在传递到u.map中。map的计算结果应为createCallbackvalue、context、argCount

iteratee变量现在应该是回调函数,下一次在z.map函数中使用时是:results[index]=iterateeobj[currentKey],currentKey,obj

这就是我迷路的地方

问题:

假设我上面的1个假设是正确的,当我们到达循环中的u.map函数的这一行时:results[index]=iterateeobj[currentKey],currentKey,obj;我们实际调用的是createCallbackobj[currentKey],currentKey,obj。那么obj[currentKey]是否传递给createCallback中的func参数?似乎没有道理

如果以上是真的,那么当计算createCallback时,我丢失的地方是obj的值,在createCallback中,obj的值是argCount。我不明白createCallback中switch语句的哪一部分被引用

在这种情况下调用哪个switch语句

如果我有,我应该能够在createCallback中完成对闭包的跟踪。非常感谢您为我提供的任何其他信息

谢谢

功能

_.地图

_.迭代尔

  _.iteratee = function(value, context, argCount) {
    if (value == null) return _.identity;
    if (_.isFunction(value)) return createCallback(value, context, argCount);
    if (_.isObject(value)) return _.matches(value);
    return _.property(value);
  };

在这一行,

results[index] = iteratee(obj[currentKey], currentKey, obj);
iteratee实际上是这样调用的

iteratee(<actual value of obj[currentKey]>, currentKey, obj);
迭代对象= 当这一行被执行时

_.iteratee(iteratee, context);
iteratee实际上是作为参数之一传递给uz.map的函数。由于没有显式地传递上下文对象,默认情况下,该值是未定义的。所以


签入createCallback函数将被计算为true,因为undefined==void 0,实际传递给u.map的函数将用作回调函数。

[…]我们实际调用的是createCallbackobj[currentKey],currentKey,obj Nope。iteratee是createCallbackiteratee上下文的返回值,而不是createCallback本身。任何地方都有类似return foo;,首先调用函数foo,然后返回其返回值。例如,如果foo返回5,我们基本上是在执行return5;。返回值可以是另一个函数,createCallback就是这种情况。@FelixKling-啊,是的,我肯定忘记了这个非常重要的部分。这现在更有意义了。最后一部分不正确。iteratee被称为iteratee=u2;。iterateeiteratee,context;,由于argCount没有设置,所以它默认为3:switch argCount==null?3:argCount。@FelixKling刚刚意识到这是错误的。实际上,它将返回func,因为上下文未定义。所以如果context==void 0返回func;将evaluated@FelixKling一开始我也是。刚刚更新了答案。顺便说一句,我觉得太宽了,你觉得怎么样?我觉得没关系。似乎对高阶函数有些困惑。@productionQA:啊,是的,那是另一回事。在JS中,函数的形式参数,例如bar、函数foobar中的baz、baz{},基本上只是为了方便地访问传递给函数的第一个和第二个参数。JS不强制参数。调用者可以传递更多或更少的参数,即foo;foo1;foo1,2;食物1,2,3。。。都是调用foo的有效方法。
iteratee(<actual value of obj[currentKey]>, currentKey, obj);
results[0] = iteratee(1, "one", obj);
results[1] = iteratee(2, "two", obj);
results[2] = iteratee(3, "three", obj);
_.iteratee(iteratee, context);
if (context === void 0) return func;