【Web前端基础】js this该如何理解

2021-01-14 17:03发布

9条回答
Sauvignon
2楼 · 2021-01-15 16:56

this是一种特殊的全局对象,在不同的环境中代表不同的含义,普通命名函数中,this指向window;对象中的函数,this指向该对象;构造函数中,this指向实例对象;事件驱动函数中,this指向触发该事件的对象

奥利给
3楼 · 2021-01-15 19:57

this通常用在函数中,在不同的环境中代表不同的含义,

普通函数中,this指向window;

对象方法中,this指向对象本身;

构造函数中,this指向实例对象;
事件函数中,this指向触发该事件的对象

在定时器中,this指向window

小猴子
4楼 · 2021-01-18 08:49

this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁实际上this的最终指向的是那个调用它的对象

例子1

1
2
3
4
5
6
function test(){
    var name = "翊枫";
    console.log(this.name); //undefined
    console.log(this); //Window
}
test();

 上面说过this最终指向的是调用它的对象,这里的函数test实际是被Window对象所点出来的,我们接着继续看。

1
2
function test(){
    var name = "翊枫";
  console.log(
this.name); //undefined
  console.log(this);  //Window
}
window.test();

 这个事实两个是一样的意思。只是为了证明是通过window对象点出来,让大家明白为啥this指向是Window

例子2:

1
2
3
4
5
6
7
var o = {
    name:"翊枫",
    fn:function(){
        console.log(this.name);  //翊枫
    }
}
o.fn();

  首先我们明白这个this指向了那里,大家看到这里应该也明白this指向了对象o,因为我们调用fn这个函数是通过了o.fn()执行,那指向明显就是对象o了。首先我们还是要强调一下,this指向函数定义时候是无法确定的,只有函数执行的时候才能确定this到底指向谁,谁调用就指向谁,我们必须要明白这个。

 上面例子可能大家都懂了,那接下来彻底搞一下这个this,让大家更加清晰明白this的指向哪里

例子3:var o = {

    name:"翊枫",
    fn:function(){
        console.log(this.user); //翊枫
    }
}
window.o.fn();

  这段代码跟离子二几乎是一样,我们限制理解下为啥这里的this为什么不是指向window,如果按照上面的理论,最终this指向的是调用它的对象,这里先说个而外话,window是js中的全局对象,我们创建的变量实际上是给window添加属性,所以这里可以用window点o对象。

  我们先不说为啥会不指向window,接下来再看一段代码。var o = {

    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //12
        }
    }
}
o.b.fn();  这里同样也是对象o点出来的,但是同样this并没有执行它,可能你会说为啥不是指向对象o?其实也不是,只是一开始说的不准确,接下来我补充一句话,相信你就可以彻底的理解this的指向的问题。

  1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window,但是我们这里不探讨严格版的问题,你可以上网查找。

  2:如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。

  3:如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象,例子3可以证明,如果不相信,那么接下来我们继续看几个例子。var o = {

    a:10,
    b:{
        // a:12,
        fn:function(){
            console.log(this.a); //undefined
        }
    }
}
o.b.fn();

尽管对象b中没有属性a,这个this指向的也是对象b,因为this只会指向它的上一级对象,不管这个对象中有没有this要的东西。

还有一种比较特殊的情况,例子4:

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指向的是window,是不是有些蒙了?其实是因为你没有理解一句话,这句话同样至关重要。

  this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的,例子4中虽然函数fn是被对象b所引用,但是在将fn赋值给变量j的时候并没有执行所以最终指向的是window,这和例子3是不一样的,例子3是直接执行了fn。

  this讲来讲去其实就是那么一回事,只不过在不同的情况下指向的会有些不同,上面的总结每个地方都有些小错误,也不能说是错误,而是在不同环境下情况就会有不同,所以我也没有办法一次解释清楚,只能你慢慢地的去体会。

 

构造函数版this:

function Fn(){
    this.user = "追梦子";
}
var a = new Fn();
console.log(a.user); //追梦子

  这里之所以对象a可以点出函数Fn里面的user是因为new关键字可以改变this的指向,将这个this指向对象a,为什么我说a是对象,因为用了new关键字就是创建一个对象实例,理解这句话可以想想我们的例子3,我们这里用变量a创建了一个Fn的实例(相当于复制了一份Fn到对象a里面),此时仅仅只是创建,并没有执行,而调用这个函数Fn的是对象a,那么this指向的自然是对象a,那么为什么对象a中会有user,因为你已经复制了一份Fn函数到对象a中,用了new关键字就等同于复制了一份。

  除了上面的这些以外,我们还可以自行改变this的指向,关于自行改变this的指向请看JavaScript中call,apply,bind方法的总结这篇文章,详细的说明了我们如何手动更改this的指向。

 


风火轮
5楼 · 2021-01-18 14:09

this通常用在函数中,在不同的环境中代表不同的含义,

普通函数中,this指向window;

对象方法中,this指向对象本身;

构造函数中,this指向实例对象;
事件函数中,this指向触发该事件的对象

在定时器中,this指向window


py大白
6楼 · 2021-01-19 09:40

this通常用在函数中,在不同的环境中代表不同的含义,

普通函数中,this指向window;

对象方法中,this指向对象本身;

构造函数中,this指向实例对象;
事件函数中,this指向触发该事件的对象

在定时器中,this指向window

例:var o = {

    name:"翊枫",
    fn:function(){
        console.log(this.user); //翊枫
    }
}
window.o.fn();


  这段代码跟离子二几乎是一样,我们限制理解下为啥这里的this为什么不是指向window,如果按照上面的理论,最终this指向的是调用它的对象,这里先说个而外话,window是js中的全局对象,我们创建的变量实际上是给window添加属性,所以这里可以用window点o对象。

  我们先不说为啥会不指向window,接下来再看一段代码。var o = {

    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //12
        }
    }
}
o.b.fn();  这里同样也是对象o点出来的,但是同样this并没有执行它,可能你会说为啥不是指向对象o?其实也不是,只是一开始说的不准确,接下来我补充一句话,相信你就可以彻底的理解this的指向的问题。

  1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window,但是我们这里不探讨严格版的问题,你可以上网查找。

  2:如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。

  3:如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象,例子3可以证明,如果不相信,那么接下来我们继续看几个例子。var o = {

    a:10,
    b:{
        // a:12,
        fn:function(){
            console.log(this.a); //undefined
        }
    }
}
o.b.fn();


尽管对象b中没有属性a,这个this指向的也是对象b,因为this只会指向它的上一级对象,不管这个对象中有没有this要的东西。


我自己打call
7楼 · 2021-01-19 09:49

在这里主要主要解释的都是函数中的this
js中的this代表的是当前函数执行的主体;
1.this是谁和函数在哪里定义的和执行的都没有关系,那么怎么才能去区分this?(非严格模式)
(1)函数的执行,首先我们先看函数前面有没有“ . ”,如果有的话,“ . ”前面是谁,this就是谁;如果没有电的话,这时候this就是window。
例:

function fn () {
  console.log(this)}var obj = {fn: fn};fn() //这时候fn里面的this就是windowobj.fn()  // 这时候的this就是windowvar obj1 = {
  sum: function () {
    fn()  //这个fn里面的this还是window
  }}obj1.sum()  //这时候sum里面的this是obj1

(2)自执行函数里面的this永远是window。

(3)给元素的某一个函数绑定方法,当事件触发的时候,执行对应的函数,方法中的this是当前函数。

 点击[removed]
  function fn () {
  console.log(this)
}
  doucument.getElementById('btn').onclick = fn ; //当点击btn按钮的时候fn中的this是#btn[removed]

(4)在构造函数模式中,类中(函数体中)出现的this.xxx = xxx中的this是当前类的一个实例。
例:

function CreatePersonal (name, age) {// 浏览器默认创建了p1,这时候this就是指的p1
 this.name = name;  
 this.age = age;
 this.personal = function () {
    console.log('name'+ this.name + ';' + 'age' + this.age)
  }}var p1 = new CreatePersonal('ant', 35);p1.personal()

(5)使用call/apply来改变this的指向(一旦遇到了上述四条都没有用了)

2.严格模式下 ‘use strict’
(1)自执行函数中的this永远是undefined

var obj = {
  fn: (function () {
    // this-> undefined
    return function () {
      // this -> obj
     }
  })(0)};obj.fn()

(2)方法执行,看方法前面是否有‘.’,有的话,‘.’前面是谁this就是谁,没有的话this就是undefined

var obj = function () {
  fn: fn};function () {}fn() // undefinedobj.fn() // this->obj

这时候我们发现严格模式下的this相对于非严格模式下的this主要区别在于: 相对于js代码中没有执行主体的情况下,非严格模式下默认都是window;但是在严格模式下,没有写就是没有执行主体,this指向的是undefined



可口可乐
8楼 · 2021-01-19 10:06

this通常用在函数中,在不同的环境中代表不同的含义,

普通函数中,this指向window;

对象方法中,this指向对象本身;

构造函数中,this指向实例对象;
事件函数中,this指向触发该事件的对象

在定时器中,this指向window


小优
9楼 · 2021-01-19 10:45

js是基于对象的脚本,在任何作用域下都有this对象。比如直接在script脚本中写的代码,当前this就指window,在在function内,this就指当前方法(即对象),如果指定了方法的原型链,this就会指向该方法的原型链

console.log(this);//window

function Test(){

console.log(this);

}

Test.prototype.method=function(){

console.log(this);

}

var test=new Test();//test

test.method();//test


相关问题推荐

  • 回答 120

    相对前几年来说,要高上不少了,毕竟入行的人也是越来越多了,基础的工作对应想要参与的人群基数越来越大,但是对于高端人才的需求还是很多,人才还是相对稀缺性的。所以,想要学web或者其他技术也一样,别等,别观望。web前端就业方向特别多包括web前端开发...

  • 回答 25

    相对定位和绝对定位是定位的两种表现形式,区别如下:一、主体不同1、相对定位:是设置为相对定位的元素框会偏移某个距离。2、绝对定位:absolute 脱离文档流,通过 top,bottom,left,right 定位。二、特点不同1、相对定位:在使用相对定位时,无论是否进行移...

  • 抓包是什么意思?2020-04-01 17:36
    回答 7
    已采纳

    抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。抓包可以通过抓包工具来查看网络数据包内容。通过对抓获的数据包进行分析,可以得到有用的信息。目前流行的...

  • 回答 89

    常用的前端框架有Bootstrap框架、React框架、Vue框架、Angular框架、Foundation框架等等

  • 回答 65
    已采纳

    前端是目的就业前景非常不错的一个计算机技术,但是自学的话还是有一定难度的,网络上自学是碎片化的,同时互联网技术跟新换代快,自己的话比较吃力也学习不到最新的技术。

  • SSR 是什么意思?2020-03-20 18:56
    回答 6

    SSR就是一台服务器,可以利用 SSR 在远程的服务器上配置 SSR,使其能够成为 SSR 节点,这样本地电脑或者其它设备利用 SSR 节点实现 VPN 或者远程上网及游戏加速等方面。ShadowsocksR(简称 SSR)是 Shadowsocks 分支,在 Shadowsocks 的基础上增加了一些数据...

  • 回答 52
    已采纳

    计算机培训方向比较多,建议找适合自己的方向选择培训编程类:JAVA、WEB、Python、C/C++、C#等测试类:软件测试运维类:云计算、网络安全设计类:UI设计、3D建模等

  • 回答 11

    1、代码判断xAxis: {type: 'time',splitLine: {show: false},interval: 3600, // 设置x轴时间间隔axisLabel: {formatter: function(value, index) {return liangTools.unix2hm(value)}}},首先要把xAxis 显示类型设置成time,然后设置对应X轴......

  • 回答 8

    HTML5 + CSS + JavaScript 开发 跨平台重用代码 

  • 回答 4

    采用rem单位自动响应,并提供独有栅格化系统快速定义宽高、边距节省css代码量,同时总结各大型移动端网页,提供一套ui颜色搭配规范,尺寸规范,字体规范等。

  • 回答 10

    iView UI、ioni、SUI

  • 回答 6

     jQTouch 

  • 回答 4

    如果只是普通的移动端用vue react 或者dva 如果是要编译成小程序什么的或者混生 就用uni-app(对应vue语法)taro(对应react) 或者纯原生 这个没有限制的,自己怎么舒服怎么来

  • 回答 4

    因为可以运用在网页和小程序的开饭中,而且开源,用着便宜,企业都很喜欢

  • 回答 10

    一、Visual Studio Code下载地址:https://code.visualstudio.com/微软在2015年4月30日Build 开发者大会上正式宣布了 Visual Studio Code 项目:一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。Visual Stud...

  • 回答 9

    jQuery自带淡入淡出效果 https://www.w3school.com.cn/jquery/jquery_fade.asp 看看这个 

没有解决我的问题,去提问