zoukankan      html  css  js  c++  java
  • JS-this的使用

    做前端开发已经半年之多了,前几天看见apply时心生疑惑,于是查阅了好多资料但还是不太理解,只知道是源于this的问题,今天偶然看到了阮一峰大佬的讲解js中的this问题(http://www.ruanyifeng.com/blog/javascript/)感觉豁然开朗啊!于是自己做一下笔记如下:

    一、原理

    this指的是函数运行时所在的环境

    例子:

    var obj = {
      foo: function () { console.log(this.bar) },
      bar: 1
    };
    
    var foo = obj.foo;
    var bar = 2;
    
    obj.foo() // 1    foo运行在obj环境,所以this指向obj
    foo() // 2        foo运行在全局环境,所以this指向全局环境

    很多书上,博客都是这样讲的;但是却没有讲为什么为这样呢?这就要说到JavaScript的数据结构设计(阮一峰大佬的讲解(http://www.ruanyifeng.com/blog/2018/06/javascript-this.html)了。

    obj.foo()是通过obj找到foo,所以就是在obj环境执行。一旦var foo = obj.foo,变量foo就直接指向函数本身,所以foo()就变成在全局环境执行。

    一、用法

    情况一:纯粹的函数调用

    这是函数的最通常用法,属于全局性调用,因此this就代表全局对象。请看下面这段代码,它的运行结果是1。

    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();
    console.log(obj.x) // 1
    
    //验证this是不是在全局环境 var x = 2 function test() {  this.x = 1; } var obj = new test(); console.log(obj.x) // 1 console.log(x) // 2 可以看到x 还是2

    情况四 call、apply 调用

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

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

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

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

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

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

    ----------------------------------------------------------------------------

    补充:

  • 相关阅读:
    C++笔记(2018/2/6)
    2017级面向对象程序设计寒假作业1
    谁是你的潜在朋友
    A1095 Cars on Campus (30)(30 分)
    A1083 List Grades (25)(25 分)
    A1075 PAT Judge (25)(25 分)
    A1012 The Best Rank (25)(25 分)
    1009 说反话 (20)(20 分)
    A1055 The World's Richest(25 分)
    A1025 PAT Ranking (25)(25 分)
  • 原文地址:https://www.cnblogs.com/yangchin9/p/10725200.html
Copyright © 2011-2022 走看看