<ul id="test">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<ul id="test2">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<script src="jquery-1.11.3.js"></script>
<script type="text/javascript">
var lis=document.getElementById("test").children;
test.onclick=function(){
Array.prototype.map.call(lis,function(v,k,a){
v.innerHTML=parseInt(v.innerHTML)+1;
console.log(this);//这里的this指向window
});
}
$("#test2").click(function(){
$("#test2 li").each(function(index,value){
$(value).html(parseInt($(value).html())+1);
console.log(this);//这里的this指向li
});
});
</script>
如题 ,我给test和test2分别用原生JS和jQuery实现了相同的功能,代码结构也几乎相同;可是在click事件处理函数中的回调函数中输出this,一个指向window,一个指向li。
有点不明白,,不应该都是指向window吗,jQuery是否做了特殊的处理??谢谢
题主题中的问题其实不是
click
事件回调中的this
指向,而是Array.prototype.map
与jQuery.each
里面回调的this
指向分别是什么。先看
map
,Array.prototype.map,有两个参数,第二个thisArg
,意为callback
执行时this
的指向,题中未指定这个参数,所以callback
中this
指向window
(非严格模式下)。再看
each
,定位到jQuery.each
代码位置,可以清楚的看到callback.apply( obj[ i ], args )
,所以callback
在执行的时候this
指向当前遍历到的原生DOM对象。