我是否正确理解了此Function.prototype.call()代码?

时间:2014-07-31 04:19:08

标签: javascript

代码:

var content = Array.prototype.map.call(document.getElementsByTagName("p"), function(e) {
  return e.innerHTML;
}); 

来自p。 367 of JavaScript:The Definitive Guide,第6版。

以下是我认为此代码中发生的事情。

变量content正在为.map()返回的NodeList段落标记分配document.getElementsByTagName("p")次调用的结果。

可以从.map()访问Array.prototype方法,并使用this将其NodeList值设置为段落标记.call()。由于.map()会应用可以访问item, index, array的函数,因此e中的function(e)NodeList的项目。

因此,content变量最终由.innerHTML调用Element Nodes NodeList.innerHTML调用的结果组成。当前文档中的段落标记。

{{1}}将返回给定HTML元素的文本,如果其中没有其他节点。否则它将返回其中的HTML节点。

这是对的吗?我试过了:

  1. 阅读MDN documentation on Function.prototype.call
  2. 搜索程序员SE我发现Misunderstanding Scope,我不确定如何解释。它声称MDN文档不完整。
  3. Definitive 一书中阅读更多内容。
  4. 在JSFiddle中乱七八糟 - 代码按预期运行,我只是想知道它是如何做的。

1 个答案:

答案 0 :(得分:7)

是的,就是这样。

只是为了真的挑剔:

  

.innerHTML将返回给定HTML元素的文本,如果其中没有其他节点。否则它将返回其中的HTML节点。

.innerHTML 始终返回元素的HTML内容,无论它是否包含子元素。当元素的文本不包含子元素时,很难发现元素的文本与元素的HTML之间的差异(但是存在差异!)。

HTML:

<div>&lt;</div>

JS:

console.log(document.getElementsByTagName("div")[0].innerHTML); // "&lt;"
console.log(document.getElementsByTagName("div")[0].textContent); // "<"

FWIW,这首先是可能的,因为许多JavaScript方法更喜欢duck typing依赖继承

  

当我看到一只像鸭子一样走路,像鸭子一样游泳,像鸭子一样呱呱叫的鸟儿时,我称这只鸟为鸭子

正因为如此,map()很乐意让你map()任何感觉的对象就像一个数组(即具有.length属性)。

您也可以使用:

var content = [].map.call(document.getElementsByTagName("p"), function(e) { return e.innerHTML; }); 

...但前者是首选,因为你不必创建,然后一次性使用数组来访问map()函数。