js中this的指向问题

1.this只指向上一级的对象(上一级的对象主要看执行语句决定),如果没有上级对象,就是window对象

  • 没有上级对象,就是window对象
var name = "kakaka";
var sayName = function(){
    alert(this.name);
}
sayName();//没有上一级,所以是window,返回kakaka
  • 指向上一级的对象, 如果上一级没有该属性,那就显示undefined
var name = "kakaka";
var object = {
    name: "lalala",
    typename: function(){
        alert(this.name);
    }
}
object.typename();//上一级是object,所以返回的是lalala
  • 指向上一级的对象, 而不会指向上上级
var name="kakaka";
var object={
    name:"lalala",
    type:{
        name:"ninini",
        typename:function(){
            alert(this.name);
        }
    }
}
object.type.typename();//上一级是type,所以返回的是ninini
  • 指向上一级的对象,赋值给一个变量,那么就参考这个变量的上一级
var name = "kakaka";
var object = {
         name:"lalala",
         type:{
                   name:"ninini",
                   typename:function(){
                   alert(this.name);
                   }
         }     
}
var j = object.type.typename;    //赋值给新对象
j();    //没有上一级,所以是window,返回kakaka

2.new可以改变this的指向,因为new创建了一个实例对象,this就指向那个对象

var obj=function(){
    this.name="lalala";
}
var j=new obj();
j.name = 'sddsd';
alert(j.name);//返回sddsd

3.当this碰到return时,return返回值是一个对象的话,this就指向那个返回的对象

var obj=function(){
        this.name="lalala";
        return {};//返回值是一个对象
}
var j=new obj();
alert(j.name);//this指的是返回的那个对象,所以为undefined


var obj=function(){
        this.name="lalala";
        return {name:'zjf'};//返回值是一个对象
}
var j=new obj();
alert(j.name);//this指的是返回的那个对象,所以为zjf

4.如果返回值不是一个对象那个的话,this还是指向函数的实例(null特殊:虽然是一个对象,但是this也指向函数实例)

var obj=function(){
         this.name="lalala";
         return undefined;//返回的值不是一个对象那个的话
}
var j=new obj();
alert(j.name);//this指向的还是原来的函数的实例,显示lalala



var obj=function(){
         this.name="lalala";
         return 'zjf';//返回的值不是一个对象那个的话
}
var j=new obj();
alert(j.name);//this指向的还是原来的函数的实例,显示lalala

5.setTimeOut的this指向在非严格模式下,是指向window,在严格模式下,是undefined

  var a = 0;
  var object = {
    test: function() {
      a: 1,
      setTimeout(function() {
        console.log(this.a);
      }, 10);
    }
  };
  object.test();   // 0 

  var a = 0;
  var object = {
    a: 1,
    test: function() {
      console.log(this.a);
    }
  };
  object.test();  // 1

6.箭头函数中的this指向,一般作为普通函数都指向调用它的对象,但是如果是作为方法,那么就指向window

    var obj = {
      a: 1,
      b: function () {
        var m = (() => {return this})();
        return m;
      } 
    }
    console.log(obj.b());     //{a: 1, b: ƒ}
var obj = {
  a: 1,
  b: () => { return this; }
};
console.log(obj.b());

7.赋值后,由于赋值表达式的值是函数本身,所以this不能维持

var name = "window"
var object = {
    name: "object",
    getName: function() {
        return this.name;
    }
}
console.log((object.getName=object.getName)())    // window

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值