Javascript 单击处理程序ECMA脚本6中的此范围
随着Javascript 单击处理程序ECMA脚本6中的此范围,javascript,jquery,ecmascript-6,Javascript,Jquery,Ecmascript 6,随着范围的扩大,此将在ES6箭头功能中可用 但在这种情况下,我无法访问arrow函数中的this,而它正在使用普通的匿名函数 范例 样本1 $(document).ready(function() { $('.principal').click(() => { alert($(this).parent().html()); // 'this' is undefined here }); }) 样本2 $(document).ready(function()
范围的扩大,此
将在ES6
箭头功能中可用
但在这种情况下,我无法访问arrow函数中的this
,而它正在使用普通的匿名函数
范例
样本1
$(document).ready(function() {
$('.principal').click(() => {
alert($(this).parent().html()); // 'this' is undefined here
});
})
样本2
$(document).ready(function() {
$('.principal').click(function() {
alert($(this).parent().html()); // 'this' is available here
});
})
将外部功能也更改为箭头功能
$( document ).ready ( ( ) => {
$( '.principal' ).click ( ( ) => {
alert ( $( this ).parent().html() );
} );
} );
您也可以尝试(根据注释添加此选项):
将外部功能也更改为箭头功能
$( document ).ready ( ( ) => {
$( '.principal' ).click ( ( ) => {
alert ( $( this ).parent().html() );
} );
} );
您也可以尝试(根据注释添加此选项):
在第一种情况下
$(document).ready(function() {
$('.principal').click(() => {
alert($(this).parent().html()); // 'this' is undefined here
});
})
由于您使用的是arrow函数,因此这里的this
对象将属于上下文外部函数,即$(document).ready
,因此它属于整个DOM元素,正如您在下面的代码段中看到的,而不是单击的元素
在第二种情况下
$(document).ready(function() {
$('.principal').click(function() {
alert($(this).parent().html()); // 'this' is available here
});
})
此
引用单击
函数的上下文,因此它返回被单击的DOM元素
$(文档).ready(函数(){
$('.principal')。单击(()=>{
console.log(this);
});
})
在第一种情况下单击
$(document).ready(function() {
$('.principal').click(() => {
alert($(this).parent().html()); // 'this' is undefined here
});
})
由于您使用的是arrow函数,因此这里的this
对象将属于上下文外部函数,即$(document).ready
,因此它属于整个DOM元素,正如您在下面的代码段中看到的,而不是单击的元素
在第二种情况下
$(document).ready(function() {
$('.principal').click(function() {
alert($(this).parent().html()); // 'this' is available here
});
})
此
引用单击
函数的上下文,因此它返回被单击的DOM元素
$(文档).ready(函数(){
$('.principal')。单击(()=>{
console.log(this);
});
})
Click
原因是jQuery将Click处理程序中的this
对象显式绑定到捕获事件的元素。获取该上下文的唯一方法是使用标准函数,因为实际上箭头函数会忽略该绑定
因此,您需要:
- 坚持使用回调的标准函数,或者
- 使用jQuery传递给回调的事件对象参数的
属性currentTarget
$(文档).ready(函数(){
$('.principal')。单击((e)=>{
log($(e.currentTarget.parent().html());
});
})
Click me
原因是jQuery将Click处理程序中的这个
对象显式绑定到捕获事件的元素。获取该上下文的唯一方法是使用标准函数,因为实际上箭头函数会忽略该绑定
因此,您需要:
- 坚持使用回调的标准函数,或者
- 使用jQuery传递给回调的事件对象参数的
属性currentTarget
$(文档).ready(函数(){
$('.principal')。单击((e)=>{
log($(e.currentTarget.parent().html());
});
})
单击箭头功能中的“我”
“此”在所附上下文中具有其原始含义。在第一个示例中,此
内部就绪
回调指向文档
,因此,此作为单击处理程序传递的内部箭头函数也指向文档
在第二个示例中,使用普通函数作为click handler这个
由jQuery在内部绑定到调用了click
方法的元素。Arrow函数不绑定这个
参数,而是使用封闭的上下文-这就是为什么这个
不能像普通函数一样绑定的原因
在您的示例中,您不需要访问单击处理程序中的外部上下文,因此不应使用箭头函数。在这种情况下,请使用普通函数。在箭头函数中,此
的原始含义来自于所包含的上下文。在第一个示例中,此
内部就绪
回调指向文档
,因此,此作为单击处理程序传递的内部箭头函数也指向文档
在第二个示例中,使用普通函数作为click handler这个
由jQuery在内部绑定到调用了click
方法的元素。Arrow函数不绑定这个
参数,而是使用封闭的上下文-这就是为什么这个
不能像普通函数一样绑定的原因
在您的示例中,您不需要访问单击处理程序中的外部上下文,因此不应该使用箭头函数。在这种情况下,请使用普通函数。它仍然是未定义的。
Hmm我只是在一个简单的示例中尝试了它。我看到了一个定义(尽管我没有使用jquery)。我还有另一个选择,我会把它作为答案的一部分。使用bindYeah加上1。它不是ES6纯的,但“bind”的明确性对我来说总是很有用的。你不能绑定到arrow函数。请检查这一点,以了解更多细节:它仍然是未定义的,我只是在一个简单的例子中尝试过。我看到了一个定义(尽管我没有使用jquery)。我还有另一个选择,我会把它作为答案的一部分。使用bindYeah加上1。它不是ES6纯的,但“bind”的明确性对我来说总是很有用的。你不能绑定到arrow函数。请检查此项,以了解更多详细信息:这是一个经典问题,请参见此处,您将获得答案,而不是使用e.target获取元素required@VinodLouisevent.currentTarget
几乎总是更好。@lonesomeday是的,对,currentTarget可以安全使用,我同意这是一个经典问题,请看这里,您将得到答案而不是使用e.target来获取元素required@VinodLouisevent.currentTarget
几乎总是更好。@lonesomeday是的