我们经常用到this,this是代表着什么?this是代表着当前方法执行的环境上下文,那么何为环境上下文,通俗的说,谁调用了函数,谁就是这个函数的环境上下文。例如:function run () {console.log(this)}var o = {run: run}run()//window对象o.run//o对象在上述代码中,run是一个函数,首先执行run()返回了window对象,为什么呢?我们已经讲过,var定义的变量会默认挂在到window对象中去,那么function定义的函数呢,也会默认挂在到window对象中去,其实我们在执行一个函数如:run() 跟window.run()是一样的,所以,window调用了run,因此函数的this是window。注意:this的绑定是产生在函数调用时,并非在函数定义时var o = {color: "red",getColor: function () {console.log(this.color)}}var color ="blue"var getColor = o.getColoro.getColor // redgetColor// blue上述代码,我们将o.getColor方法赋值给了一个变量getColor,然后我们分别执行了两个方法,缺得到了不同的结果,对于o.getColor并没有什么疑问,但是初学者可能认为getColor返回的也应该是red,但事实是blue,这就说明了,this是产生在函数调用时,因为在o.getColor赋值语句,就相当于一下语句var getColor = function () {console.log(this.color)}o.getColor返回的是这个函数,并没有绑定this,也就是说getColor其实是被赋值了一个函数,仅此而已,this是在调用时绑定的,所以得到了那样的结果。
不要被模样给蒙蔽
看下面代码:var o = {run : function () {setTimeout(function () {console.log(this) }, 1000)}}o.run()//window对象以上运行了o.run方法,隔一秒输出this,输出了window对象,初学者可能会疑问,o.run调用时明明是在o对象下啊,this应该是o对象啊!不错,有这个疑问说明对this有一定了解了,但是上面案例是在setTimeout方法中的回调函数中输出的this,此回调函数执行时,是以fn()方式执行的(涉及到异步回调),前面说过直接执行函数相当于window.fn,因此输出了window对象。拓展回调:回调是进行异步操作常用的功能,上面示例中,我们可以假设为setTimeout是这样定义的function setTimeout (fun) {fun()}setTimeout (function () {console.log(this)})可以看出,fun是直接调用的,输出的this必定是window对象。