2017-01-22 65 views
0

什么是有效的[].forEach.call函数参数?在下面的代码el看起来是Nodelist或节点列表的元素?什么是有效的[] .forEach.call函数参数?

[].forEach.call(
    document.getElementById('menu').querySelectorAll('.custom-can-transform'), 
     function(el){ 
      el.classList.toggle('pure-menu-horizontal'); 
     } 
    ); 
) 
+0

你想在这里完成什么? – hackerrdave

+0

你知道NodeList有一个forEach方法吗? – evolutionxbox

+0

[ECMAScript 5.1,15.4.4.18](http://www.ecma-international。org/ecma-262/5.1 /#sec-15.4.4.18):“_ forEach函数是有意为通用的;它不要求它的这个值是一个Array对象,因此它可以被转移到其他类型的对象中以用作一个方法,forEach函数是否可以成功应用于主机对象,取决于实现._“ – Andreas

回答

0

许多数组方法是通用设计。这意味着它们的内部实现不依赖于thisArray实例。基本上,这种实现只需要这个对象具有数字索引和length属性。这些对象被称为“类似数组的对象”。

有许多符合此要求的物体。例如您观察到的NodeList为document.getElementById('menu').querySelectorAll。这是类似数组的对象,因为您可以通过索引访问各个节点,并且此类节点列表具有length属性。

任何字符串也是类似数组的对象。例如,字符串“hello world”。你可以访问字符“w”str[t]。并且str.length等于11.

数值索引和length的要求允许方法实现遍历集合中的所有单个元素,而无需知道该集合实际上是什么。

这也使人们有可能使用不同对象的通用方法:

const obj = {0: 'one', 1: 'two', length: 2}; 
 

 
Array.prototype.forEach.call(obj, (el, index) => { 
 
    console.log(`${index}: ${el}`) 
 
})

或者,对于这种“借用”其他原型方法最常见的用途是用在非阵列方法阵列,通常DOM元素:

const items = document.querySelector('ul > li') 

const ids = [].map.call(items, li => li.id) 

这里我应该注意,来自ES2015规范的spread operator使得这种借用方法不太需要。

0

Function.prototype.call用函数的第一个参数替换该函数的this变量,然后调用该函数,其余所有参数都被赋予.call()

这意味着上面的代码的计算结果为这样:

document.getElementById('menu').querySelectorAll('.custom-can-transform').forEach(function(el){ 
    el.classList.toggle('pure-menu-horizontal'); 
}); 

注意的forEach而不使用.call()方法的this变量将是[],因为它的前缀呼叫forEach

至于数组上的参数forEach是什么?

它只接受2个参数。第一个参数是为数组的每个元素调用的函数callback。第二个(可选)参数用于将this变量注入回调方法的函数体中。 source

相关问题