javascript中this指向的问题
javascript中this只有函数执行时候才能确定到底指向谁,实际this最终指向是那个调用它的对象。
1,匿名函数中的this——window
function foo(){ var lastName = 'miya'; console.log(this.lastName); //undefined console.log(this); //window } foo();
2,作为对象的方法的this
//作为对象方法 var obj = { a:1, getA: function(){ console.log( this === obj); //true console.log(this.a) //1 } } obj.getA();
再看这个例子:
var o = { a:10, b:{ // a:12, fn:function(){ console.log(this.a); //undefined } } } o.b.fn();
此时的this.a是undefined,原因是:尽管fn被最外层的o对象所调用,但是this指向的只是当前fn的上一级的对象,也就是b对象,b对象没有a属性,所以输出undefined。
再看另外一种比较特殊的this指向情况:
var o = { a:10, b:{ a:12, fn:function(){ console.log(this.a); //undefined console.log(this); //window } } } var j = o.b.fn; j();
这个比较好理解:this指向的永远是最后调用它的对象,也就是函数执行时候的对象,很明显通过对象j去执行fn函数,j的this指向是window,而全局没有a属性,所以输出是undefined。
3,构造函数的this执行
function Fn(){ this.user = "miya"; } var a = new Fn(); console.log(a.user); //miya
此时Fn构造函数中this指向是a对象,因为new关键字改变了this指向,a是Fn的实例,为什么new关键字会改变this指向,因为new一个实例时候是先创建了一个空对象,然后将原对象或原对象原型上的方法或属性copy一份到新对象上。所以this指向改变到新对象上面。
再来看个例子:
function fn(){ this.name = 'miya'; return {name:'Jone'}; } var a = new fn(); console.log(a.name);
觉着是不是应该返回miya,但实际返回的是Jone;
function fn(){ this.name1 = 'miya'; return function(){}; } var a = new fn(); console.log(a.name1); //undefined
此时,a instanceof fn //false;表示a不是fn的实例了。
ES6中的class类的constructor中也有类似的例子:
class Foo { constructor() { return Object.create(null); } } new Foo() instanceof Foo // false
ES6的class相当于ES5中的构造器函数,constructor方法默认返回实例对象this,但是如果返回全新的对象,那么实例就不是原类的实例了。
如果构造函数返回的是一个对象,那么this指向就是那个返回对象,但如果不是对象,this指向还是构造函数的实例。
function fn(){ this.name1 = 'miya'; return null; } var a = new fn(); console.log(a.name1); //miya
a instanceof fn //true
照理说null也是对象,但是此时this指向还是构造函数的实例对象,因为null比较特殊。
所以代码中:beforefn.apply( this, arguments );//this指向就是当前的beforefn,因为是beforefn在执行,所以this当然是beforefn了。
【完】
究竟什么是真理?———不可驳倒的谬误便是。 —尼采