zoukankan      html  css  js  c++  java
  • JS JavaScript中的this

    this是JavaScript语言中的一个关键字

    它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。

    function test() {
     this.x = 1;
    }

    上面代码中,函数test运行时,内部会自动有一个this对象可以使用。

    那么,this的值是什么呢?

    函数在不同使用场合,this有不同的值。总之,this就是函数运行时所在的环境对象。

    情况一:纯粹的函数调用

    这是函数的最常通用法,属于全局性调用,因此this就代表全局对象。

    var x = 1;
    function test() {
       console.log(this.x);
    }
    test();  // 1

    情况二:作为对象的方法调用

    函数还可以作为某个对象的方法调用,这时this就指这个上级对象

    function test() {
      console.log(this.x);
    }
    
    var obj = {};
    obj.x = 1;
    obj.m = test;
    
    obj.m(); // 1

    情况三:作为构造函数调用

    构造函数就是通过这个函数可以生成一个新对象。这时,this就指这个新对象

    function test() {
     this.x = 1;
    }
    
    var obj = new test();
    obj.x // 1

    为了表明这时this不是全局对象,下面代码:

    var x = 2;
    function test() {
      this.x = 1;
    }
    
    var obj = new test();
    x  // 2

    运行结果为2,表明全局变量x的值没有变化

    情况四:apply调用

    apply()是函数的一个方法,作用是改变函数的调用对象。它的第一个参数就表示改变后的调用这个函数的对象。因此,这时this指的就是这个参数。

    var x = 0;
    function test() {
     console.log(this.x);
    }
    
    var obj = {};
    obj.x = 1;
    obj.m = test;
    obj.m.apply() // 0

    apply()的参数为空时,默认调用全局变量。因此,这时运行结果为0,证明this指的是全局对象。

    如果把最后一行代码修改成

    obj.m.apply(obj); //1

    运行结果就变成1,证明这时this代表的对象是obj

    改变this的指向有以下几种方法

    使用ES6的箭头函数

    在函数内部_this=this

    使用apply、call、bind

    new实例化一个对象

    其实this的指向,始终坚持一个原理:this永远指向最后调用它的那个对象。

    几个例子:

    例1:

        var name = "windowsName";
        function a() {
            var name = "Cherry";
    
            console.log(this.name);          // windowsName
    
            console.log("inner:" + this);    // inner: Window
        }
        a();
        console.log("outer:" + this)         // outer: Window

    这里我们没有使用严格模式,如果使用严格模式的话,全局对象就是 undefined,那么就会报错 Uncaught TypeError: Cannot read property 'name' of undefined

    例2:

        var name = "windowsName";
        var a = {
            name: "Cherry",
            fn : function () {
                console.log(this.name);      // Cherry
            }
        }
        a.fn();

    例3:

    var name = "windowsName";
    var a = {
        name: "Cherry",
        fn : function () {
            console.log(this.name);      // Cherry
         }
      }
    window.a.fn();

    例4:

        var name = "windowsName";
        var a = {
            // name: "Cherry",
            fn : function () {
                console.log(this.name);      // undefined
            }
        }
        window.a.fn();

    例5:

        var name = "windowsName";
        var a = {
            name : null,
            // name: "Cherry",
            fn : function () {
                console.log(this.name);      // windowsName
            }
        }
    
        var f = a.fn;
        f();

    为什么不是 Cherry,这是因为虽然将 a 对象的 fn 方法赋值给变量 f 了,“this 永远指向最后调用它的那个对象”,由于刚刚的 f 并没有调用,所以 fn() 最后仍然是被 window 调用的。所以 this 指向的也就是 window。

    例6:

        var name = "windowsName";
    
        function fn() {
            var name = 'Cherry';
            innerFunction();
            function innerFunction() {
                console.log(this.name);      // windowsName
            }
        }
    
        fn()
  • 相关阅读:
    HDU1205 吃糖果【水题】
    HDU2568 前进【水题】
    架构图初体验
    五层架构
    文件系统权限设计涉及范畴
    微服务
    领域驱动设计
    容器技术Docker
    架构总结
    仓储模式的简单理解
  • 原文地址:https://www.cnblogs.com/lhh520/p/10261388.html
Copyright © 2011-2022 走看看