Javascript 为什么';这';在xxx.click事件中调用jQuery对象时,是否引用该对象?
我正在做一些关于bind的练习,我有一个关于jquery的click函数的愚蠢问题。为什么当我传入一个单击的方法时,“this”指向触发单击的jquery对象,但当我传入一个匿名函数时,却没有发生这种情况?我理解如果“this”指的是jquery对象,那么我们需要使用bind,但不理解为什么“this”会改变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)
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')
。