理解js中this的指向

学习自原文  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指向的也只是它上一级的对象,

时间: 2024-10-21 09:49:16

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

转:彻底理解js中this的指向,不必硬背

转:http://www.cnblogs.com/pssp/p/5216085.html 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题. 为什么要学习this?

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

原文链接:http://www.cnblogs.com/pssp/p/5216085.html 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题. 为什么要学习th

彻底理解js中this的指向

<script> //this指向的是最终调用它的那个对象 //this指向的是window function aa(){ var str = 'jack'; console.log(this.str); //undefined console.log(this); //window } window.aa(); //this指向的是bb var bb = { str : 'jack', show : function(){ console.log(this.str); //jack } }

理解JS中的call、apply、bind方法

理解JS中的call.apply.bind方法(*****************************************************************) 在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:apply . call .bind 三者都是用来改变函数的this对象的指向的:apply . call .bind 三者

轻松了解JS中this的指向

JS中的this指向一直是个让人头疼的问题,想当初我学的是天昏地暗,查了好多资料,看的头都大了,跟他大战了那么多回合,终于把它搞定个七八分,其实往往都是我们复杂化了,现在就让大家轻松看懂this的指向,我会分以下几种情况来说. this的指向:  1 this 指的是调用当前方法(函数)的那个对象,也就是说函数在谁那被调用,this就指的是谁.   来看两个栗子: oBtn.onclick = function(){         alert(this);   //oBtn  } oBtn[i

理解js中的作用域以及初探闭包

前言 对于js中的闭包,无论是老司机还是小白,我想,见得不能再多了,然而有时三言两语却很难说得明白,反正在我初学时是这样的,脑子里虽有概念,但是却道不出个所以然来,在面试中经常会被用来吊自己的胃口,考察基础,虽然网上自己也看过不少相关闭包的文章,帖子,但貌似这玩意,越看越复杂,满满逼格高,生涉难懂的专业词汇常常把自己带到沟里去了,越看越迷糊,其实终归结底,用杨绛先生的一句话就是:"你的问题在于代码写得太少,书读得不够多",其实在我看来前者是主要的,是后者的检验, 自知目标搬砖20年(还

从Ecma规范深入理解js中的this的指向

this是面向对象编程中的一个概念,它一般指向当前方法调用所在的对象,这一点在java.c++这类比较严格的面向对象编程语言里是非常明确的.但是在javascript中,this的定义要灵活许多,如果未准确掌握,非常容易混淆.本人在面试过程中也发现,面试者很少有由能够回答得非常全面的.本文总结了this的各种情况,并从Ecma规范的角度探讨了this的具体实现,希望对大家理解this有所帮助. this指向的四中情况 在javascript里面,this的指向可以归纳为以下四种情况.只要能牢记这

了解Js中的this指向

Js中的this对象是在运行时基于函数的执行环境绑定的,其中的this指向很不好理解,一不小心就用错了位置;. this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象. 对于this指向的理解,我分以下几种情况来说, this的指向: 1.在全局函数中,this等于window: var name="cyp"; console.log(this); 2.当函数被用作为某个对象的方法调用时,this等于哪个对

JS 中 this 的指向

文章转载自: 作者:伯乐在线专栏作者 - 追梦子 链接:http://web.jobbole.com/88264/ 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题