This.id возвращает undefined внутри объявленной функции

Я знаю, что варианты этого задавались сотни раз, но после поиска и чтения десятков похожих вопросов я стал особенно толстым, и я не могу приблизиться к выяснению того, почему и как это происходит, поэтому рискую быть застреленным вниз в огне ...

Устранение неполадок я сократил все до самого простого, поэтому у меня есть html формы

<li class='field' id='field_2'>

если я запишу функцию jquery как

$('.field').on('mouseenter',function(){console.info(this.id)});

он возвращает идентификатор в порядке, но если я объявляю и вызываю такую ​​функцию, как

function shade(){
    console.info(this.id);
};

$('.field').on('mouseenter',function(){shade()});

он возвращает undefined.

Также пробовал в shade () передавать идентификатор как 'var', используя .attr () и т.д., если это не помогло.

Любой может указать мне, что я делаю не так, «для чайников», прежде чем я просто сдамся и объявлю идентификатор как глобальную переменную в центре мыши, будет очень признателен.

Спасибо!

Предоставьте рабочий фрагмент кода, воспроизводящий описанную проблему.

Ason 18.03.2018 12:16
$('.field').on('mouseenter', shade); - передать ссылку на функцию вместо ее вызова из анонимной функции
baao 18.03.2018 12:18

Потому что это выходит за рамки функции.

Artur P. 18.03.2018 12:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
589
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы должны использовать вызов()

function shade(){
    console.info(this.id);
};

$('.field').on(
    'mouseenter', 
    function(){
        shade.call(this)
    }
);
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<li class='field' id='field_2'>hover me</li>

Да, это и предложение от datacure ниже работают, спасибо. Просто пытаюсь понять, почему сейчас, поскольку я уверен, что раньше использовал ту же «структуру» без этой проблемы. Думаю, пора надеть мою мыслящую шляпу. Ваше здоровье.

O Lopez 18.03.2018 12:39

@OLopez добавить console.info(this); в обе функции. Зарегистрируйте его с .call(this) и без него и обратите внимание на разницу. Это может помочь вашей мыслящей шляпе прояснить некоторые вещи.

caramba 18.03.2018 12:50

Я вижу большую проблему: this кажется текущим элементом в jQuery. Вот 2 решения:

1- Вы можете установить переменную this: var this = $ ('. field'); this.on ('mouseenter', функция () {console.info (this.id)});

2- если вы хотите использовать текущий элемент cibling DOM в jQuery, не используйте this, а вместо этого используйте $(this) с $.

var this приведет к следующему исключению: Uncaught SyntaxError: Неожиданный токен this. Вы не можете использовать зарезервированные ключевые слова в качестве имени переменной
baao 18.03.2018 12:45

Вы можете называть это как хотите, это просто пример ^^

kevinniel 18.03.2018 13:10

jQuery: Причина этого в том, что при использовании jQuery вы используете функцию, которая настраивает this как событие, а не как элемент DOM.

См. Следующий вывод:

function shade(){
    console.info(this);
};

$('.field').on('mouseenter',function(){shade()});
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<li class='field' id='field_2'>

<!-- You may have to wait a short while after you hover over the bullet point -->

Вам нужно будет использовать традиционный JavaScript в качестве обходного пути.

function myId(el){
 console.info (el.id);
}
.area{ width: 50%; height: 5em; background: lime; margin: 0 auto}
<div class = "area" id = "greenbox" onmouseover = "myId(this)"></div>

Или обратитесь к элементу класса, как предлагали другие (я не буду добавлять это к своему ответу, поскольку считаю, что другим следует отдать должное за то, что они предоставили вам решение)

Спасибо, поскольку я ответил Карамбе выше, и ваш, и его метод работают, поэтому мне нужно немного подумать, чтобы понять, почему. Большое спасибо

O Lopez 18.03.2018 12:41

P.s. Кажется, мне разрешено проголосовать и отметить в качестве ответа только одного из вас, чтобы не выбирать, я оставил их карамбе на основании того, что я первый. Извини ;-)

O Lopez 18.03.2018 12:44

Это вполне приемлемо, спасибо, что нашли время поделиться своими мыслями :)

DataCure 18.03.2018 12:45

Другие вопросы по теме