Я споткнулся на этот аккуратный ярлык для преобразования DOM NodeList в эквидистантную антенную решетку, но я должен признать, я не полностью понимаю, как это работает:
[].slice.call(document.querySelectorAll('a'), 0)
Таким образом, это запускается с пустого массива []
, тогда slice
используется для преобразования результата call
к новому массиву да?
Бит, который я не понимаю, call
. Как это преобразовывает document.querySelectorAll('a')
с NodeList на эквидистантную антенную решетку?
Что здесь происходит, что вы Вызов Slice ()
Как будто это было функцией NodeList
, используя вызов ()
. Какие нарезают в этом случае
[)
()
. Создается пустой массив, затем итерации через объект, он работает на (первоначально массив, сейчас Nodelist
) и продолжать добавлять элементы этого Объект к пустую его созданный массив, который в конечном итоге возвращается. Вот а также статья .
Редактировать:
Итак, он начинается с пустого массива [], затем ломтик используется для Преобразуйте результат вызова на новый массив да?
Это не правильно. [] .SLICE
Возвращает функциональный объект. Объект функции имеет функцию Call ()
, который вызывает функцию, присваивая первому параметру call ()
, это
; Другими словами, создание функции считают, что он вызывается из параметра (NodeList
, возвращаемый Document.QuerySelectorall («A»)
), а не из массива.
Мои личные предпочтения используют смесь пробелов и кронштейнов, подобных этому:
if( statement ) {
// let's do this
} else {
// well that sucks
}
Я думаю, что это выглядит чисто и делает мой код очень легко читать и самое главное - отладка.
-121--717066- Это извлекает слой
, функцию из массива
. Затем он вызывает эту функцию, но используя результат Document.QuerySelectorAll
как объект этого
вместо фактического массива.
В javascript методы объекта могут быть привязаны к другому объекту во время выполнения. Короче говоря, javascript позволяет объекту "заимствовать" метод другого объекта:
object1 = {
name:'frank',
greet:function(){
alert('hello '+this.name)
}
};
object2 = {
name:'andy'
};
// Note that object2 has no greet method.
// But we may "borrow" from object1:
object1.greet.call(object2); // will show an alert with 'hello andy'
Callcall
и apply
methods of function objects (в javascript функции также являются объектами) позволяет это сделать. Таким образом, в своем коде можно сказать, что Nodelist заимствует метод среза массива. Преобразование заключается в том, что срез возвращает другой массив в качестве результата.