Объяснение [] .slice.call в JavaScript?

Я споткнулся на этот аккуратный ярлык для преобразования DOM NodeList в эквидистантную антенную решетку, но я должен признать, я не полностью понимаю, как это работает:

[].slice.call(document.querySelectorAll('a'), 0)

Таким образом, это запускается с пустого массива [], тогда slice используется для преобразования результата call к новому массиву да?

Бит, который я не понимаю, call. Как это преобразовывает document.querySelectorAll('a') с NodeList на эквидистантную антенную решетку?

184
задан Yansky 23 January 2010 в 16:48
поделиться

3 ответа

Что здесь происходит, что вы Вызов Slice () Как будто это было функцией NodeList , используя вызов () . Какие нарезают в этом случае [) () . Создается пустой массив, затем итерации через объект, он работает на (первоначально массив, сейчас Nodelist ) и продолжать добавлять элементы этого Объект к пустую его созданный массив, который в конечном итоге возвращается. Вот а также статья .

Редактировать:

Итак, он начинается с пустого массива [], затем ломтик используется для Преобразуйте результат вызова на новый массив да?

Это не правильно. [] .SLICE Возвращает функциональный объект. Объект функции имеет функцию Call () , который вызывает функцию, присваивая первому параметру call () , это ; Другими словами, создание функции считают, что он вызывается из параметра (NodeList , возвращаемый Document.QuerySelectorall («A») ), а не из массива.

147
ответ дан 23 November 2019 в 05:57
поделиться

Мои личные предпочтения используют смесь пробелов и кронштейнов, подобных этому:

if( statement ) {

    // let's do this

} else {

    // well that sucks

}

Я думаю, что это выглядит чисто и делает мой код очень легко читать и самое главное - отладка.

-121--717066-

Это извлекает слой , функцию из массива . Затем он вызывает эту функцию, но используя результат Document.QuerySelectorAll как объект этого вместо фактического массива.

26
ответ дан 23 November 2019 в 05:57
поделиться

В 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 заимствует метод среза массива. Преобразование заключается в том, что срез возвращает другой массив в качестве результата.

114
ответ дан 23 November 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: