Javascript 为什么';这';在xxx.click事件中调用jQuery对象时,是否引用该对象?

Javascript 为什么';这';在xxx.click事件中调用jQuery对象时,是否引用该对象?,javascript,jquery,Javascript,Jquery,我正在做一些关于bind的练习,我有一个关于jquery的click函数的愚蠢问题。为什么当我传入一个单击的方法时,“this”指向触发单击的jquery对象,但当我传入一个匿名函数时,却没有发生这种情况?我理解如果“this”指的是jquery对象,那么我们需要使用bind,但不理解为什么“this”会改变 var test = { data: 'Hello World', getData: function() { console.log(this.data)

我正在做一些关于bind的练习,我有一个关于jquery的click函数的愚蠢问题。为什么当我传入一个单击的方法时,“this”指向触发单击的jquery对象,但当我传入一个匿名函数时,却没有发生这种情况?我理解如果“this”指的是jquery对象,那么我们需要使用bind,但不理解为什么“this”会改变

var test = {
    data: 'Hello World',
    getData: function() {
        console.log(this.data);
    }    
};
//Base case - calling a method on an object
test.getData();

//test 1 -> doesn't work
$('#test1').click(test.getData);

//test2 -> works
$('#test2').click(test.getData.bind(test));

//test3 -> works
$('#test3').click(function(event) {
    test.getData();
});

这是因为单击函数中的
是单击的元素

所以这一行:

$('#test1').click(test.getData);
$('#test2').click(test.getData.bind(test));
将函数中的
this
转换为
#test1

这一行:

$('#test1').click(test.getData);
$('#test2').click(test.getData.bind(test));
您正在使用bind,它将
更改为发送的第一个参数。在这种情况下:对象
测试

这一行:

$('#test3').click(function(event) {
    test.getData();
});
您有一个函数可以启动另一个函数。单击的元素(在第一个代码段中提到)被传递给第一个函数

$('#test3').click(function(event) {
    console.log(this); //`#test3`
    test.getData();
});

因此
text.getData()
此值未更改,它是原始值。换句话说,
this
将是对象
test

从技术上讲,
this
不绑定到jQuery对象,而是绑定到底层DOM元素。因为这就是
this
的工作方式。从MDN文档中了解更多信息:jQuery显式地将
this
映射到适合您的元素。即使使用事件委派并将单击事件绑定到
文档
,jQuery也会将
更改为委派的元素。谢谢,这确实帮助我理解了这个概念。谢谢,这很有意义!对于test3,为什么“this”指的是匿名函数中的#test3->为什么它不指全局窗口(例如,在方法中的独立函数中,“this”指的是全局窗口)@DanTang:因为jQuery将事件处理程序中的
this
设置为处理程序绑定到的元素@DanTang
在每次调用函数时重新确定,而不是在声明函数时。如果您声明了
function foo(){}
,然后将其分配给
myobj.bar=foo
,并且使用
foo
myobj.bar
作为事件侦听器,则它们在运行时都会具有事件目标的
this
。函数是否作为方法附加到对象并不重要。传递给
click
的函数对象本身不知道它是否是一个方法;这只是一份说明书。当您调用
myobj.bar()
时,函数会被告知在调用时应该有一个
this
myobj
。没什么要添加的,说得好。#谢谢,我现在明白了。基本上,它类似于
document.getElementById('test3')。onclick=function fn()…
这在fn中是指
doucment.getElementById('test3')