在js中,this是根据它的作用域来指向它的上下文环境。
全局执行
在全局环境中,我们看看它的this是什么:
可以看到返回的是一个window对象。
在node中,this返回的是global对象。
总结:在全局作用域中它的 this 执行当前的全局对象(浏览器端是 Window,node 中是 global)。
函数中执行
纯粹的函数调用
我们可以看到,一个函数被直接调用的时候,属于全局调用,这时候它的this指向全局对象。
严格模式 ‘use strict’;
如果在严格模式的情况下执行纯粹的函数调用,那么这里的的 this 并不会指向全局,而是 undefined,这样的做法是为了消除 js 中一些不严谨的行为:
在控制台中,打印出undefined.
当然,把它放在一个立即执行函数中会更好,避免污染全局:
作为对象的方法调用
当一个函数被当做对象的方法调用的时候:
这时候,this指向了当前这个对象,
当然,我们还可以这么做,
同样不变,因为js中一切皆对象,函数也是一个对象,对于test,它只是一个函数名,函数的引用,它指向这个函数,当 foo=test时,foo同样也指向了这个函数。
如果把对象的方法赋值给一个变量,然后直接调用这个变量呢:
可以看到,这时候 this 执行了全局,当我们把 test = obj.foo ,test 直接指向了一个函数的引用,这时候,其实和 obj 这个对象没有关系了,所以,它是被当作一个普通函数来直接调用,因此,this 指向全局对象。
一些坑
我们经常在回调函数里遇到一些坑:
var obj = { name:'holy', foo:function(){ console.log(this); }, foo2:function(){ console.log(this); setTimeout(this.foo,1000); } }; obj.foo2();