2017-01-22 66 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

相關問題