在 jquery 中,什么this
意思以及何时使用?
jQuery 中的“this”是什么意思?
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 中
更新:从 ES5 的严格模式开始,这不再正确,this
指一个对象。this
可以有任何value。的值this
任意给定的函数调用内由下式确定的函数是如何被调用(不其中函数被定义,如在如C#或Java语言)。this
调用函数时最常见的设置方法是通过对象上的属性调用函数:
var obj = {};
obj.foo = function() {
alert(this.firstName);
};
obj.firstName = "Fred";
obj.foo(); // alerts "Fred"
在那里,因为我们叫foo
经上的属性obj
,this
设置为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`
不过,this
JavaScript 中还有很多值得探索的地方。这个概念很强大,如果你习惯了其他一些语言的做法(而不是如果你习惯了其他语言),那么它有点具有欺骗性,并且值得了解。
下面是一些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
;实时复制。
这个关键字
在 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 评论。
关键字 this 充当占位符,当该方法在 Java Script 中实际使用时,将引用调用该方法的任何对象