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

    【完】

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

  • 相关阅读:
    hdu 1402 大数A*B模板(FFT)
    ccpc 哈尔滨L题 LRU Algorithm
    今年得慢慢学的
    Codeforces Round #629 (Div. 3) E. Tree Queries(LCA)
    Codeforces Global Round 7 D2. Prefix-Suffix Palindrome (Hard version) -- manacher
    hdu 3068 (manacher算法)
    用Socket API建立简易tcp服务端和客户端
    Win下建立Socket时注意事项
    线段树(Segment Tree)
    Codeforces Round #643 (Div. 2)
  • 原文地址:https://www.cnblogs.com/tangjiao/p/10107606.html
Copyright © 2020-2023  润新知