学习自原文  http://www.cnblogs.com/pssp/p/5216085.html后的一点小结(原文作者总结的很棒^_^)!
  关于js中this的指向,在函数定义的时候还无法确定,只有在函数执行的时候才能确定this到底指向谁,实际上this最终指向的是调用它的对象。
eg1:

function a(){
    var user = "xxxx";
    console.log(this.user); //undefined
    console.log(this); //Window  }

a();//此处和执行window.a()是一样的效果
··········································································································································································································································································
eg2:
var o = {
    user:"xxxx",
    fn:function(){
        console.log(this.user);  //xxxx   
    }
}
o.fn(); //此处和执行window.o.fn();是一样的效果。 这里的this指向的是对象o,因为你调用这个fn是通过o.fn()执行的,那this自然指向的就是对象o
···········································································································································································································································································
eg3:
var o = {
    a:10,

    b:{
        fn:function(){
            console.log(this.a); //undefined   }

}
}

o.b.fn();//尽管对象b中没有属性a,这个this指向的也是对象b,因为this只会指向它的上一级对象,不管这个对象中有没有this要的东西。
··········································································································································································································································································
eg4:
var o = {
    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //undefined
            console.log(this); //window        }
    }

}
var j = o.b.fn;//将对象o的属性b的方法即函数fn赋给变量j,此时并没有执行;
j(); //加了一个()立即执行函数fn,此处和执行window.fn();是一样的效果,此时this指向的是window。this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的, 这句话至关重要。
     例子4中虽然函数fn是被对象b所引用,但是在将fn赋值给变量j的时候并没有执行所以最终指向的是window,这和例子3是不一样的,例子3是直接执行了fn。
··········································································································································································································································································
eg5:
var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;
      };
    }
  };
 console.log(object.getNameFunc( )( )); // The Window
     这里object.getNameFunc( )( )会先执行object.getNameFunc( ),返回function( ){ return this.name; }这个函数,函数function(){ return this.name;}后面跟了一个( )会执行这个函数,此时这里的this指向的是window对象,所以this.name的值就是The Window。
··········································································································································································································································································
eg6:
 var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };
    }
  };
console.log(object.getNameFunc()()); // My Object
     这里object.getNameFunc( )( )会先执行object.getNameFunc( ),返回function( ){ return this.name; }这个函数,函数function(){ return this.name; }后面跟了一个( )会执行这个函数,此时这里的this被赋值给了that,改变了this的指向,此时的this指向的是object对象,而不是window对象,所以this.name的值就是My Object 。
 
备注:

(function(){
....
})()

第一个括号是个运算符,它会返回这个匿名函数,然后最后一个小括号会执行这个函数。

······································································································································································································································································
结论:
  情况1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window。这里需要说明的是在js的严格版中this指向的不是window,严格模式下禁止this关键字指向全局对象,严格模式下,this的值为undefined。

  情况2:如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。

  情况3:如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象,

理解js中this的指向的更多相关文章

  1. 彻底理解js中this的指向,不必硬背。

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  2. 彻底理解js中this的指向

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  3. 【转发】彻底理解 JS 中 this 的指向

    为什么要学习this?如果你学过函数式编程,面向对象编程,那你肯定知道干什么用的,如果你没有学过,那么暂时可以不用看这篇文章,当然如果你有兴趣也可以看看,毕竟这是js中必须要掌握的东西. 例子1: f ...

  4. 【转】彻底理解js中this的指向,不必硬背。

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  5. 如何简单理解js中this的指向

    前序 每个人学js都会被this指向这个东西搞得很蒙,那就是this的指向问题.首先,我们要明白 this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上thi ...

  6. 彻底理解js中this的指向,不必硬背

    来自   https://blog.csdn.net/u011088260/article/details/79230661 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行 ...

  7. 彻底理解js中this的指向,不必硬背(转)

    转自: http://www.h5cn.com/js/jishu/2016/0226/18248.html 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定th ...

  8. 彻底理解 JS 中 this 的指向

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  9. 如何更好的理解js中的this,分享2段有意思的代码

    关于js中this的浅析,大家可以点击[彻底理解js中this的指向,不必硬背]这篇博客了解. 今天遇到2段比较有意思的代码. ----------------第一段----------------- ...

随机推荐

  1. BZOJ树链剖分题目汇总

    1036,2157,2243,4034,4196;2325,2908,3083,3159,3531,3626,3999;可以不树剖:1146;2819,2843,4448,4530.

  2. JQuery遍历方法$.each输出函数

    each()方法能使DOM循环结构简洁,不容易出错.each()函数封装了十分强大的遍历功能,使用也很方便,它可以遍历一维数组.多维数组.DOM, JSON 等等在javaScript开发过程中使用$ ...

  3. JavaScript学习笔记——BOM_window对象

    javascript浏览器对象模型-windwo对象 BOM Browser Object Model window对象 是BOM中所有对象的核心. 一.属性 1.(位置类型-获得浏览器的位置) IE ...

  4. 关闭和启动adb服务命令

    在运行中输入 关闭——adb kill-server 重启——adb start-server

  5. js取float型小数点后两位数的方法

    四舍五入以下处理结果会四舍五入:' var num =2.446242342; num = num.toFixed(2); // 输出结果为 2.45   不四舍五入以下处理结果不会四舍五入:第一种, ...

  6. swiper 增加同页面增加2个滚动

    js代码 <script type="text/javascript"> var mySwiper = new Swiper('.slide_a',{ noSwipin ...

  7. sqlserver检测死锁;杀死锁和进程;查看锁信息

    http://blog.sina.com.cn/s/blog_9dcdd2020101nf4v.html sqlserver检测死锁;杀死锁和进程;查看锁信息 ( ::)转载▼ 标签: sql 检测死 ...

  8. 遍历JObject

    JObject jo = JObject.Parse(jsonStr); IEnumerable<JProperty> properties = jo.Properties(); fore ...

  9. SQLServer中获取特定表的所有列名

    1.获取特定表的所有列名: Select Name FROM SysColumns Where id=Object_Id('tableName') 参考:http://blog.csdn.net/wu ...

  10. Android Studio-设置快速转换局部变量为成员变量

    "File"-"Settings"-"KeyMap"-"Main Menu"-"Refactor"- ...