jQuery 中的“this”是什么意思?

IT技术 javascript jquery
2021-01-17 17:27:33

在 jquery 中,什么this意思以及何时使用?

6个回答

this在 JavaScript 中是非常特殊和强大的。它可以意味着任何事情。在这里这里介绍了其中的一些内容,但是找到一个关于 JavaScript 的好教程并花一些时间来学习它真的很值得。

我们先来看看 jQuery 对它的使用,然后在 JavaScript 中更一般地谈论它(有点)。

在 jQuery 中,特别是

在用 jQuery 编写的代码中,this 通常指的是作为被调用函数主题的 DOM 元素(例如,在事件回调中)。

示例 jQuery 事件回调(文档中this涵盖的内容.bind):

$("div").click(function() {
    // Here, `this` will be the DOM element for the div that was clicked,
    // so you could (for instance) set its foreground color:
    this.style.color = "red";

    // You'll frequently see $(this) used to wrap a jQuery object around the
    // element, because jQuery makes lots of things a lot simpler. You might
    // hide the element, for example:
    $(this).hide();
});

类似地,作用于当前 jQuery 选择器匹配的所有元素的各种 jQuery 函数可以选择接受一个函数,当该函数被调用时,this又是有问题的 DOM 元素——例如,该html函数允许:

// Find all divs inside the `foo` element, and set
// their content to their CSS class name(s)
// (Okay, so it's a hokey example)
$("#foo div").html(function() {
    return this.className;
});

jQuery 使用的另一个地方this是在回调中jQuery.each

var a = ["one", "two", "three"];
jQuery.each(a, function() {
    alert(this);
});

...这将提醒“一”,然后是“二”,然后是“三”。如您所见,这是完全不同的this.

(令人困惑的是,jQuery 有两个称为each函数,上面的一个在 jQuery/$ 函数本身上并且总是以这种方式调用 [jQuery.each(...)$.each(...)],另一个在 jQuery实例[对象] 上而不是 jQuery/$ 函数本身。这里是另一个的文档,我不会在这个答案中讨论另一个,因为它使用this相同的方式html和事件回调,我想展示jQuery不同用法this。)

一般在 JavaScript 中

this指一个对象。 更新:从 ES5 的严格模式开始,这不再正确,this可以有任何value。的值this任意给定的函数调用内由下式确定的函数是如何被调用(不其中函数被定义,如在如C#或Java语言)。this调用函数时最常见的设置方法是通过对象上的属性调用函数:

var obj = {};
obj.foo = function() {
    alert(this.firstName);
};
obj.firstName = "Fred";
obj.foo(); // alerts "Fred"

在那里,因为我们叫foo经上的属性objthis设置为obj呼叫的持续时间。但是不要给人foo以任何方式与 结婚的印象obj,这很好用:

var obj = {};
obj.foo = function() {
    alert(this.firstName);
};
obj.firstName = "Fred";
obj.foo(); // alerts "Fred"

var differentObj = {};
differentObj.firstName = "Barney";
differentObj.bar = obj.foo; // Not *calling* it, just getting a reference to it
differentObj.bar(); // alerts "Barney"

事实上,foo根本不与任何对象绑定

var f = obj.foo; // Not *calling* it, just getting a reference to it
f(); // Probably alerts "undefined"

在那里,因为我们没有f通过对象属性调用,所以this没有明确设置。this未明确设置时,它默认为全局对象(window在浏览器中)。window可能没有属性firstName,所以我们的警报中出现了“未定义”。

还有其他方法可以调用函数并设置什么this:通过使用函数.call.apply函数:

function foo(arg1, arg2) {
    alert(this.firstName);
    alert(arg1);
    alert(arg2);
}

var obj = {firstName: "Wilma"};
foo.call(obj, 42, 27); // alerts "Wilma", "42", and "27"

call设置this为您给它的第一个参数,然后将您给它的任何其他参数传递给它正在调用的函数。

apply 做完全一样的事情,但是你把函数的参数作为一个数组而不是单独地给它:

var obj = {firstName: "Wilma"};
var a   = [42, 27];
foo.apply(obj, a); // alerts "Wilma", "42", and "27"
//             ^-- Note this is one argument, an array of arguments for `foo`

不过,thisJavaScript 中还有很多值得探索的地方这个概念很强大,如果你习惯了其他一些语言的做法(而不是如果你习惯了其他语言),那么它有点具有欺骗性,并且值得了解。

下面是一些this在 ES5 的严格模式下不引用对象的例子

(function() {
    "use strict";   // Strict mode

    test("direct");
    test.call(5, "with 5");
    test.call(true, "with true");
    test.call("hi", "with 'hi'");

    function test(msg) {
        console.log("[Strict] " + msg + "; typeof this = " + typeof this);
    }
})();

输出:

【严格】直接;typeof this = 未定义
【严格】同5;typeof this = 数字
【严格】同真;typeof this = 布尔值
【严】同'嗨';typeof this = 字符串

而在宽松模式下,所有这些都会说typeof this = object实时复制

@brk:您的意思是要编辑答案以将代码块转换为可运行的片段吗?如果是这样:去吧,谢谢!
2021-03-13 17:27:33
0 否决票这是我将如何解释它,简单地说:this 指的是调用该函数的对象。由于 differentObj 调用了 foo(),这将指向 differentObj。由于f是在全局范围内定义的,它是window对象的一个​​方法,所以this指向window。由于 window 对象没有属性 firstName,因此 this.firstName 返回 undefined 有趣的事实:在全局范围内定义的任何东西,即顶层/级别,都成为 window 对象的属性(全局范围 = 窗口对象)。
2021-03-22 17:27:33
@ryanwaite28:“这指的是调用该函数的对象”不,它不是。对象不调用方法,代码调用;在 JavaScript 中,代码只是松散地链接到对象。当代码调用方法时,它this显式或隐式地将 的值设置为它喜欢的任何——在严格模式下,它甚至可能不是一个对象引用,它可能是一个原始值。
2021-03-22 17:27:33
从技术上讲,克劳德是的。但是为了以人们可以理解的方式解释它,我说对象。但感谢您添加抽象细节。“这个”字面上可以指任何东西。
2021-04-05 17:27:33
@TJCrowder 我可以添加编辑片段并将它们放在堆栈片段中吗?
2021-04-08 17:27:33

这个关键字

在 JavaScript 中,所谓的 this 是“拥有”JavaScript 代码的对象。

当在函数中使用时,this 的值是“拥有”该函数的对象。当在对象中使用时,this 的值是对象本身。对象构造函数中的 this 关键字没有值。它只是新对象的替代。当使用构造函数创建对象时,this 的值将成为新对象。

请注意,这不是变量。它是一个关键字。您无法更改此值。

这是我将如何解释它,简单地说:

this指的object 是所谓function

所以看着这个:

var foo = {
  name: "foo",
  log: function(){
    console.log(this.name);
  }
}

var bar = {
  name: "bar"
}
bar.log = foo.log;
bar.log();

bar 对象将 foo 的 log 方法的引用存储到它自己的 log 属性现在当 bar 调用它的 log 方法时, this 将指向 bar 因为该方法是由 bar 对象调用的。

这适用于任何其他对象,甚至窗口对象。如果通过全局作用域调用函数,则 this 将指向 window 对象。

通过使用函数的 bind 或 call 方法,您可以显式定义对象this在执行期间将引用的内容。

有趣的事实:在 中定义的任何内容global scope,即顶层/级别,都成为window object(全局范围 = 窗口对象)的属性

“javascript this”的顶级 Google 搜索结果:http : //www.quirksmode.org/js/this.html

编辑:我认为关键句子是:

“在 JavaScript 中,“this”总是指我们正在执行的函数的“所有者”,或者更确切地说,是指函数作为其方法的对象。”

Quirksmode(通常*)非常出色,值得详细阅读整篇文章。

*显然,此声明不一定正确,请参阅下面的 TJ Crowder 评论。

jQuery用 Javascript 编写的。任何 jQuery 代码也是 Javascript
2021-03-13 17:27:33
@TJCrowder 你能解释一下这个神话或链接到更多关于你的信息吗?
2021-03-15 17:27:33
不是在 javascript.. 这个在 jquery.. 无论如何谢谢!:D
2021-03-16 17:27:33
@DanielSokolowski:我博客上的两篇文章:神话方法你必须记住this:-)
2021-03-28 17:27:33
“'在 JavaScript 中,“this”总是指我们正在执行的函数的“所有者”,或者更确切地说,指的是该函数是其方法的对象。'”哇,我希望文章的其余部分比那。这句话延续了一个破坏性的神话,不符合 quirksmode 通常的标准。
2021-03-30 17:27:33

关键字 this 充当占位符,当该方法在 Java Script 中实际使用时,将引用调用该方法的任何对象