this的指向

参考地址:http://home.cnblogs.com/group/topic/69994.html

 

例1:因为下面有个定时器,所有指向的是全局的,setTimeout 无论在哪里,this指的都是window

1
2
3
4
5
6
7
8
9
10
11
12
var name = "Bob";
var nameObj ={
  name : "Tom",
  showName : function(){
    alert(this.name);                           //BOb
  },
  waitShowName : function(){
    setTimeout(this.showName, 1000);
  }
};
 
nameObj.waitShowName();

如果想获取的名称为Tom,代码应该如下: 

在执行nameObj.waitShowName函数时,我们先对其this赋给变量that(这是为了避免setTimeout中的匿名函数运行时,

复制代码
var name = "Bob";  
var nameObj ={  
    name : "Tom",  
    showName : function(){  
        alert(this.name);  
    },  
    waitShowName : function(){
        var that = this;
        setTimeout(function(){
            that.showName();
        }, 1000);
    }
}; 
 
 nameObj.waitShowName();  //Tom
复制代码

 

),然后延迟运行匿名函数,执行that.showName,即nameObj.showName 

 

例2:

1
2
3
4
5
6
7
8
9
10
11
12
13
var someone = {
  name: "Bob",
  showName: function(){
    alert(this.name);
  }
};
 
var other = {
  name: "Tom",
  showName: someone.showName     //这句话等价于:showName:  function(){alert(this.name);}  这里的函数来自someone.showName, 所以this指的是当前other
}
 
other.showName();  //Tom

  

 

 

例3:

1
2
3
4
5
6
7
8
9
10
11
12
13
var name = "Tom";
 
var Bob = {
 
  name: "Bob",
  show: function(){
    alert(this.name);
  }
}
 
var show = Bob.show;        //这句话等价于:var show =  function(){alert(this.name);}  这里的函数来自BOb.show, 所以this指的是window
 
show();            //Tom

  

 

例4:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var name = "window";
 
var Bob = {
  name: "Bob",
  showName: function(){
    alert(this.name);
  }
};
 
var Tom = {
  name: "Tom",
  showName: function(){
    var fun = Bob.showName;     //这句话等价于:var fun =  function(){alert(this.name);}  这里的函数来自BOb.showName, 因为这里重新var 了fun,所以作用域链已经断掉,重新指向了window
    fun();
  }
};
 
Tom.showName();  //window

  

 例5:eval函数,其执行时候似乎没有指定当前对象,但实际上其this并非指向window,因为该函数执行时的作用域是当前作用域,即等同于在该行将里面的代码填进去

复制代码
var name = "window";

var Bob = {
    name: "Bob",
    showName: function(){
        eval("alert(this.name)");
    }
};

Bob.showName();    //Bob
复制代码

 

 

 

 

 

 

 

  
posted @   vivi.wang  阅读(185)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
阅读排行:
· Apifox不支持离线,Apipost可以!
· 零经验选手,Compose 一天开发一款小游戏!
· Trae 开发工具与使用技巧
· 历时 8 年,我冲上开源榜前 8 了!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示