美文网首页程序员
懒人学js:怎么理解this在js里的指向问题

懒人学js:怎么理解this在js里的指向问题

作者: 麦劲 | 来源:发表于2018-06-06 10:53 被阅读23次

尝试用简单直观的方法,为学编程的朋友提供一种思路。

this,在编程语言里,指代某个引用了“this所在的函数”的内存空间。

C++java等语言里,当声明一个,并实例化一个对象时,this指的是这个对象所在的(复制出来的)内存空间。

图片1.png

所以用this.xx的语法可以引用该内存块内的各种变量。

c++等程序经过编译成机器码后,每个this都有固定的内存块指向,所以this的指向很明确。

js是一种脚本解释型语言,支持函数式编程,所有函数在执行前,都是以字符串的形式存在的。

图片2.png

除了可以在a1里直接引用

a1.f1();

实例a1里的函数f1的函数内容,还可以通过赋值语句传给其他对象使用(这是非函数式编程语言做不到的)


var k1=a1.f1;

k1();

这时,函数的实际执行内存空间,就变成了k1所在的内存空间。

那么这个空间是哪里呢?

js里,当某个对象没有显式声明时,都会自动挂载在全局对象window上。

所以上述例子k1();相当于window.k1();函数中的this,指代的就是window了。

图片3.png
而当k1有显式声明的所有者时

var owner={};

owner.k1=a1.f1;

owner.k1();

执行时,this所在的内存空间为owner,所以这里this指代的是owner

PS:这里可以再深究owner所在的内存空间,其实也是window,但是this只会指向最终引用它的那一块内存空间,不会再往上指向。

完整示例如下

var p = 2;     //挂载在window上的p=2

var a1 = {

    p: 1,    //a1里的p=1

    f1: function() {

        console.log(this.p);

    }

}

a1.f1(); //这里输出 1

k1 = a1.f1;

k1();  //这里输出 2

var owner = {};

owner.p = 3;    //挂载在owner里的p=3

owner.k1 = a1.f1;

owner.k1();  //这里输出 3

几种特殊情况

  1. 使用严格模式时(在代码首行加上'use strict'),只有直接引用时this会生效,通过赋值给其他对象使用的话,this会报错。

  2. 箭头函数里的this,会自动绑定定义时所在的内存空间,不会发生指向变化。

  3. 闭包所在的一阶函数内的this,因为闭包会自动挂载在window下,这时候this指代window

  4. js支持在函数内定义另一个函数,这时候定义出来的函数如果没有显式执行,也会自动挂载在window上。

function a(){
     function b(){
        this....
    }
    return b();  //b自动挂载在window上执行,相当于window.b()
}
a();    //这时函数b里的this指代window

相关文章

  • 懒人学js:怎么理解this在js里的指向问题

    尝试用简单直观的方法,为学编程的朋友提供一种思路。 this,在编程语言里,指代某个引用了“this所在的函数”的...

  • 面试题的总结与解答

    1,js中this指向的理解 在js面向对象编程里我们避免不了使用this,所以理解this指向对于在面向对象编程...

  • JS进阶篇-this指向问题

    JS中this的指向问题不同于其他语言,JS中的this不是指向定义它的位置,而是在哪里调用它就指向哪里。 JS中...

  • 一文搞定js this指向call、apply、bind区别问题

    js有三座大山,this、原型链、回调js this指向问题一镜到底:为了方便理解,请用大白话理解这几个词:thi...

  • js:this指向问题

    var 作用域 先来看个简单的例子: 直觉地,内部函数可以访问外部函数的变量,外部不能访问内部函数的变量。上面的例...

  • JS this指向问题

    this:指的是你的函数执行时所在的环境(作用域) 函数this的指向(箭头函数除外): 谁调用函数,这个this...

  • 在js中this的指向问题

    在js中从上下文角度看this指向 话不多说先放码 请先写出各个函数调用之后的console输出 嗯。。。最后我会...

  • 彻底理解js中this的指向问题

    首先需要理解: 1.this的指向在函数定义的时候并不能确定this的指向 2.this的最终指向是那个调用它的直...

  • js的this指向问题

    跟函数在哪定义的和在哪执行的都没有关系 1、函数执行看函数名前面有没有".",没有就是window,有的话"."前...

  • js的this指向问题

    this指向详情参考:https://blog.csdn.net/weixin_37722222/article/...

网友评论

    本文标题:懒人学js:怎么理解this在js里的指向问题

    本文链接:https://www.haomeiwen.com/subject/hztbsftx.html