Javascript 为什么这是jQuery事件处理程序中的窗口对象?
我有一个小的加载脚本来设置一些类,如下所示:Javascript 为什么这是jQuery事件处理程序中的窗口对象?,javascript,jquery,arrow-functions,Javascript,Jquery,Arrow Functions,我有一个小的加载脚本来设置一些类,如下所示: function frameIt() { console.log("called frameit") $( 'img' ).on('load', () => { console.log("running listener") debugger; $( this ).addClass( "tasty" ); }); console.log("set listener") } 我的问题是,$(this)始终
function frameIt() {
console.log("called frameit")
$( 'img' ).on('load', () => {
console.log("running listener")
debugger;
$( this ).addClass( "tasty" );
});
console.log("set listener")
}
我的问题是,$(this)
始终设置为窗口
,即使上下文中的this
是加载的img
标记,正如Chrome的调试器所示。你知道为什么会这样吗?以下是Chrome调试器屏幕截图:
这是因为箭头函数不绑定它们自己的
这个
上下文——它们接受封闭范围的这个
值。由于jQuery在内部绑定了事件处理程序的this
,但this
不能绑定到箭头函数,this
引用窗口,因为它是封闭范围的this
值。改用常规函数。但是。。。但是()=>
是新的函数吗!!?!显然不是。谢谢你指出这一点。我要等7分钟,直到我能接受答案。欢迎来到堆栈溢出!虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满你的代码,这会降低代码和解释的可读性!
$( 'img' ).on('load', function () {
console.log("running listener")
debugger;
$( this ).addClass( "tasty" );
});