jQuery和原生JS中 this 的区别

        <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是否做了特殊的处理??谢谢

阅读 4.1k
4 个回答

题主题中的问题其实不是click事件回调中的this指向,而是Array.prototype.mapjQuery.each里面回调的this指向分别是什么。

先看mapArray.prototype.map,有两个参数,第二个thisArg,意为callback执行时this的指向,题中未指定这个参数,所以callbackthis指向window(非严格模式下)。

再看each,定位到jQuery.each代码位置,可以清楚的看到callback.apply( obj[ i ], args ),所以callback在执行的时候this指向当前遍历到的原生DOM对象。

原生和JQ肯定是有区别的 jq对dom很多都进行了封装 jq内部扩展了很多原生所没有的方法,和对不同浏览器的兼容处理

少年,你应该试试addEventListener的回调中this指向谁。
jquery做了兼容处理,会分别用addEventListeneronclick的方式。用ie8和1.xx.x版本jquery你会发现jquery也指向window

http://jsrun.net/V7YKp 可以你个链接,你结合控制台看看。

下面是我个人的一些见解,function里面的this是指向调用他的对象,在非严格模式下,如果没有明确的调用对象,他会指向window。

obj={};obj.fun = function(){};//这个function 的this指向obj。

;(function(){})();//这个指向window

那么问题就来了,下面这个function很明显的没有用.call .apply .bind绑定this。他就是应该指向window或者undefined

function(v,k,a){
    v.innerHTML=parseInt(v.innerHTML)+1;
    console.log(this);//这里的this指向window
}

那么问题又来了,为什么jquery的可以,多说一句废话,jquery非常的好,用起来特别的爽为什么?jquery是一个常用来操作DOM的类库,他进行了一些的封装,让使用者更加的爽。同样你也可以多增加一个方法,把下面这个东西封装一下,让他每次把this绑上去,这样,你就也爽了。

Array.prototype.map.call(lis,function(v,k,a){
    v.innerHTML=parseInt(v.innerHTML)+1;
    console.log(this);//这里的this指向window
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题