zoukankan      html  css  js  c++  java
  • this指向

    理解javascript中this的指向

    正常情况下,this指向最终调用它的对象。(不做this指向)

    function a() {
        console.log(this);
    }
    a();        // window对象

    上面代码相当于

    function a() {
        console.log(this);
    }
    window.a();        // window对象

    this的执行,是由window对象的a方法调用的,所以this指向window


    var a = {
        'print': function () {
            console.log(this);
        }
    }
    a.print();        // a对象
    window.a.print();        // a对象

    this是由a对象的print方法调用的,a对象虽然属于window对象,但this指向最终调用它的对象,所以this指向a。


    var a = {
        'b': {
            'print': function() {
                console.log(this);
            }
        }
    }
    a.b.print();        // b对象

    这个就不用解释了。


    function b() {
        console.log(this);
    }
    var a = {
        'print': function () {
            b();        // 此处相当于window.b();
        }
    }
    a.print();        // window对象

    这个例子中,a对象只是调用的print方法,最终调用this的是window对象的b方法。


    function b() {
        console.log(this);
    }
    var a = {
        'print': b
    }
    a.print();        // a对象

    这个例子中,将b方法给了a对象的print方法,所以this是由a.print方法调用的。


    若不太理解,可看成下面的

    var a = {
        'print': function b() {
            console.log(this);
        }
    }
    a.print();        // a对象

     

    这样就很容易理解了。


    var a = {
        'print': function () {
            console.log(this);
        }
    }
    var b = a.print;
    b();            // window对象

    a.print只是一个函数,这个函数赋给b,再由b执行,而b属于window对象,最终调用this的就成window对象了。


    闭包的this指向问题


    var a = {
        'print': function() {
        
            console.log(this);        // a对象
            
            (function () {
                console.log(this);    // window对象
            }()) ;
            
        }
    }
    a.print();

    在闭包中this指向window对象。


    var a = {
        'print': function () {
            setTimeout(function() {
                console.log(this);
            }, 500);
        }
    }
    a.print();        // window对象

    setTimeout & setInterval 中,延后执行的内容,this指向window。


    new关键字

    function A() {
        this.print = function () {
            console.log(this);
        }
    }
    var a = new A();
    a.print();        // a对象

    new关键字会创建一个空的对象,然后会自动调用一个函数apply方法,将this指向这个空对象,这样的话函数内部的this就会被这个空的对象替代。


    通过new关键字创建的对象,若构造函数有返回值,且返回值为对象,则创建的对象为返回值,返回值不为对象,创建的对象为构造的对象,更多请看new关键字


    严格模式中默认this不在指向window,而是undefined。


    更多关于this,改变this指向




  • 相关阅读:
    5G网络类型 ?
    命令行签名
    软件著作权之源代码
    汗,查了很久的问题,竟然是重载错函数
    终于考完PMP
    ImportError: No module named _tkinter on macos
    numpy.trace对于三维以上array的解析
    ValueError: output parameter for reduction operation logical_and has too many dimensions ?
    numexpr low version warning
    Execution failed for task ':compileDebugAidl'.
  • 原文地址:https://www.cnblogs.com/seeks/p/10176976.html
Copyright © 2011-2022 走看看