Javascript 如何';这';关键字在map()和call()中工作?
我一直在刷新我的JavaScript知识,了解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']; …使用一个简单的函数
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);