Переместить функцию за пределы цикла - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь вывести функцию из цикла, а затем вызвать ее изнутри, но я не уверен, как это сделать.

const links = document.querySelectorAll( 'a' );

for ( let i = 0; i < links.length; i++ ) {

    links[i].addEventListener( 'click', ( event ) => {
        const targetID = '#' === event.currentTarget.getAttribute( 'href' ) ? 'start' : event.currentTarget.getAttribute( 'href' );
        ...rest of the function...
    } );
}

Это то, что я пробовал до сих пор:

const links = document.querySelectorAll( 'a' );

function smoothScrolling( event ) {
    const targetID = '#' === event.currentTarget.getAttribute( 'href' ) ? 'start' : event.currentTarget.getAttribute( 'href' );
    ...rest of the function...
}

for ( let i = 0; i < links.length; i++ ) {

    links[i].addEventListener( 'click', smoothScrolling( event ) );
}

Я не уверен почему, но я получаю следующую ошибку: Uncaught TypeError: Cannot read property 'currentTarget' of undefined.

1 Ответ

1 голос
/ 13 марта 2019

Вы почти поняли ... Проблема в том, что вы вызываете функцию и передаете результат.Вместо этого вы просто хотите передать саму функцию, как будто это объект.Попробуйте это:

const links = document.querySelectorAll( 'a' );

function smoothScrolling( event )
{
     const targetID = '#' === event.currentTarget.getAttribute( 'href' ) ? 'start' : 
     event.currentTarget.getAttribute( 'href' );
     ...rest of the function...
}

for ( let i = 0; i < links.length; i++ )
{
    links[i].addEventListener( 'click', smoothScrolling );
}

Указав функцию без каких-либо аргументов, она будет передана вместо вызова.То, как вы это сделали, это вызвать smoothScrolling, а затем использовать результат того, что вы не хотите.

...