程序员

再学 this

2020-06-27  本文已影响0人  老衲不生气

执行上下文主要分为三种:全局执行上下文、函数执行上下文、eval执行上下文。而this和执行上下文是相互绑定的,所以对应的this也分为全局执行上下文的this、函数执行上下文的this、eval执行上下文的this。

1、全局执行上下文中的 this

动手操作,在控制台中打印this

全局执行上下文中的 this
最终输出的是 window 对象
结论:全局执行上下文中的 this 是指向 window 对象的

2、函数执行上下文中的 this

示例代码1

function foo(){
  console.log(this)
}
foo()

打印结果也是 window 对象。这说明在默认情况下调用一个函数,其执行上下文中的 this 也是指向 window 对象的。也就是说,foo()等同于window .foo()
示例代码2


var obj = {
  name : "老衲不生气", 
  showThis: function(){
    console.log(this)
  }
}
obj.showThis()

执行这段代码,你可以看到,最终输出的 this 值是指向 obj 的。这说明使用对象来调用其内部的一个方法,该方法的 this 是指向对象本身的
永远注意一点:
this永远指向最后调用他的对象
this永远指向最后调用他的对象
this永远指向最后调用他的对象
马上,看一道陷阱题:

var obj = {
  name : "老衲不生气",
  showThis: function(){
    this.name = "俺也是风一般的男子"
    console.log(this)
  }
}
var foo =obj.showThis
foo()

打印出的this指向全局 window 对象。
分析:showThis 赋给一个全局对象foo,然后再调用该对象。 this永远指向最后调用他的对象

3、eval执行上下文的this

上代码

//1、
(function(){
    eval("console.log(this)")
})()
//2、
function Foo(){
  this.bar = function(){
       eval("console.log(this)")
  }
}
var foo = new Foo()
foo.bar()

打印结果:
window对象
Foo对象
说明eval指向调用上下文的this

4、构造函数的this

function CreateObj(){
  this.name = "老衲不生气"
}
var myObj = new CreateObj()

new 创建了对象 myObj,那你知道此时的构造函数 CreateObj 中的 this 到底指向了谁吗?
首先先理解new关键字做了什么:

5、补充

上一篇下一篇

猜你喜欢

热点阅读