为什么我需要使用函数作为参数,并且可以'不要只使用它返回的值

Why do I need to use function as an argument and can't just use the value it returns

本文关键字:返回 函数 参数 为什么      更新时间:2023-09-26

我是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());

这一切都与范围和this 的值有关

在第一个例子中,函数创建了一个新的范围,就像所有函数一样,其中this是当前迭代的元素,因为jQuery在内部迭代元素集合,并相应地设置this的值

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

在第二个代码中,没有设置特殊的作用域,因此作用域是代码所在的任何作用域,很可能是窗口作用域,或者如果它在$(document).ready作用域中,this将是文档

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

您可以在MDN 上阅读更多关于函数和函数范围的信息

以下内容:

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

"this"指的是它找到的元素,而在你的尝试中它没有找到。

如果你想缩短它,你可以试试

$('p').eq(0).after($(this).prev());

这是因为第二个版本中的this可能会返回Window对象。在不同的点上用console.log(this)进行实验,以了解它的含义是如何变化的。这样的东西也会产生你所期望的结果:

var b = $('p').eq(0).prev();
$('p').eq(0).after(b);