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了。

 

【完】

究竟什么是真理?———不可驳倒的谬误便是。                   —尼采

 

posted @ 2018-12-13 15:55  tangjiao_Miya  阅读(167)  评论(0编辑  收藏  举报