Javascript 如何';这';关键字在map()和call()中工作?

Javascript 如何';这';关键字在map()和call()中工作?,javascript,arrays,dictionary,this,call,Javascript,Arrays,Dictionary,This,Call,我一直在刷新我的JavaScript知识,了解call()和map()在NodeList上的用法 用谷歌搜索出call()应该做的事情相当容易,参考资料中有一些例子说明了它是如何与map()一起工作的 但是,正如我在MDN上注意到的,map()函数也可以使用第二个参数,它应该为map()设置这个关键字,或者至少我认为它应该这样做 我曾尝试使用简单的数组来检查它: var numbers = [1, 2, 3]; var letters = ['a', 'b', 'c']; …使用一个简单的函数

我一直在刷新我的JavaScript知识,了解
call()
map()
NodeList
上的用法

用谷歌搜索出
call()
应该做的事情相当容易,参考资料中有一些例子说明了它是如何与
map()一起工作的

但是,正如我在MDN上注意到的,
map()
函数也可以使用第二个参数,它应该为
map()
设置
这个
关键字,或者至少我认为它应该这样做

我曾尝试使用简单的数组来检查它:

var numbers = [1, 2, 3];
var letters = ['a', 'b', 'c'];
…使用一个简单的函数,它将作为
map()
的参数提供:

现在,我不明白的是,为什么这两个函数调用有不同的结果:

numbers.map(effector, letters);
numbers.map.call(letters, effector);
我希望它们都将字母输出到控制台,因为这两个
关键字都应该引用它们(分别引用它们的对象)

我做了一些进一步的研究,并尝试使用这种改进的效应器功能:

var effector = function () {
    console.log(this);
}
……关于:

numbers.map(effector, letters);
numbers.map.call(letters, effector);
假设我们在“严格使用”,第一个调用记录
字母
,第二个日志记录
未定义

但是,我还是希望这两个调用产生相同的输出

我错过了什么

编辑:

我在读,
.map
如何可以多填充,如果您在MDN上检查它,您就会看到,.map的第二个参数是如何在
callback.call()中使用的

我想,最后,即使是
callback.call()
也应该具有与
.map
中相同的
this


参考有两种绑定:

  • 用于
    映射
    函数的执行上下文
  • 用于回调函数的执行上下文
他们彼此没有关系

map
的第二个参数指示回调的
this
。如果未提供,则默认值为
未定义
(不是数组)

map.call
的第一个参数指示了该
将用于
map
内容,以及迭代哪个数组

这也反映在mdn上提供的中:它完全符合这些规范:
O
map
函数获取
This
的值,
T
为回调获取
This
的值。它们通常是不同的

map
forEach
与您的问题无关,但值得一提的是:当您没有实际映射任何内容时,不要使用
map
map
用于创建一个新数组,在该数组中,通过调用同一索引处的原始值上的回调函数,每个值都已映射


但是,如果您只需要迭代数组值,而不打算执行这种映射,则使用
forEach
方法或
for…of
循环。这两个函数都在
NodeList
开箱即用,无需
。call

数字.map(效应器,字母)
数字.map.call(字母,效应器)
取决于
设置为
字母的函数

如前所述,在第一个参数中,第二个参数是在回调中用作
this
的值-即提供给
map
的参数。也就是说,在
numbers.map(效应器,字母)
中,
效应器内的
将是
字母
。由于
效应器
(在第一个版本中)不关心此
是什么,因此该参数基本上无效,并且记录了
数字
的内容

另一方面,在
numbers.map.call(字母、效应器)
中,正是
numbers.map
将其
设置为
字母。这实际上意味着,
map
方法虽然在
numbers
上被调用,但却被“劫持”到记录
字母的条目中


第二个例子的工作原理与此类似-关键的问题是此
设置在哪个函数中:
效应器
在一种情况下,
数字.map
在另一种情况下。

我希望它们具有相同的结果,没有任何可能的差异。不过我应该在帖子中强调一下。旁注:你也可以用
.bind()
方法更改
这个
(你比我早一分钟到达:)(并且表达得更清楚了)谢谢你试图澄清地图的使用并回答我的问题,但是你能检查我的编辑吗?我可能理解你的答案,但我认为,还有更多的东西。我知道.map的返回值,我一直在关注它,因为不久我将开始学习React,我知道,该map用于JSX返回,而不像forEach。我不想把我的问题改成forEach,因为我想避免map/forEach差异可能带来的新挑战。我阅读了你的编辑,但我在polyfill中没有发现与我的答案不一致的地方。变量
T
未定义,除非
map
收到第二个参数:在这种情况下,
T
成为该值
T
将是回调的
值(仅限)。这就是我在回答中所说的:
This
与调用
map
本身的
This
无关。实际用途完全取决于程序员:这是一种方便。当在类方法中调用这样的
映射时,它可以使用,您希望回调具有引用该类实例的
this
,因此它可以使用
this.method
注释调用类的其他方法
numbers.map(effector, letters);
numbers.map.call(letters, effector);