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

Я новичок в jQuery и просматриваю учебник, посвященный изменению DOM.

Вот пример из этого урока.

HTML часть:

<h1>My Awesome Post</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod</p>

Сценарий

(function() {
  $('p').eq(0).after(function() {
    return $(this).prev();
  });
})();

Я не понимаю, зачем мне здесь использовать функцию, если все, что она делает, возвращает значение? Почему следующее утверждение не работает?

$('p').eq(0).after( $(this).prev());
4 голоса | спросил Dmitry Samoylov 14 SatEurope/Moscow2013-12-14T23:33:02+04:00Europe/Moscow12bEurope/MoscowSat, 14 Dec 2013 23:33:02 +0400 2013, 23:33:02

3 ответа


0

Все дело в области видимости и значении this

В первом примере функция создает новую область видимости, как это делают все функции, где this - это элемент с итерацией в настоящий момент, как jQuery. выполняет внутреннюю итерацию по коллекции элементов и соответственно устанавливает значение this

$('p').eq(0).after(function() { // new scope, where "this" is the element
    return $(this).prev();
});

Во втором коде специальная область не задана, поэтому область действия - это любая область видимости, в которой находится код, скорее всего, область окна, или если она находится в $(document).ready scope, this будет документом

$('p').eq(0).after( $(this).prev()); // there is no scope here

Вы можете узнать больше о функции и области действия в MDN

ответил adeneo 14 SatEurope/Moscow2013-12-14T23:42:43+04:00Europe/Moscow12bEurope/MoscowSat, 14 Dec 2013 23:42:43 +0400 2013, 23:42:43
0

Следующее:

function() {
    return $(this).prev();

«this» относится к элементу, который он находит, а в вашей попытке - нет.

Если вы хотите сократить его, попробуйте

$('p').eq(0).after($(this).prev());
ответил Mark 14 SatEurope/Moscow2013-12-14T23:41:59+04:00Europe/Moscow12bEurope/MoscowSat, 14 Dec 2013 23:41:59 +0400 2013, 23:41:59
0

Это потому что this во второй версии скорее всего возвращает объект Window. Поэкспериментируйте с console.log(this) в разных точках, чтобы понять, как меняется его значение. Нечто подобное может привести к ожидаемому результату:

var b = $('p').eq(0).prev();
$('p').eq(0).after(b);
ответил ryan 14 SatEurope/Moscow2013-12-14T23:41:25+04:00Europe/Moscow12bEurope/MoscowSat, 14 Dec 2013 23:41:25 +0400 2013, 23:41:25

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132