资讯专栏INFORMATION COLUMN

理解学习this指向问题

dendoink / 3371人阅读

摘要:否则报错在严格模式下,对象的函数中的指向调用函数的对象实例同样道理,可以推断出,在严格模式下,构造函数中的指向构造函数创建的对象实例。

要点

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

this指向的三种情况

情况1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window,而是指向调用函数的对象实例,这种函数中的this等于undefined。

function a(){
        var user = "维他奶";
        console.log(this);//window
        console.log(this.user);//undefined
    }
    //windonw是全局对象,所有的全局变量都是对象的属性.
    //a()<=>window.a()
    a();
    console.log(window);
    console.log(window.user);//根本没有user这个属性。只有一个name="";

运行结果

严格模式,请参照https://segmentfault.com/a/11...
严格模式下定义变量必须使用var。否则报错.
在严格模式下,对象的函数中的this指向调用函数的对象实例
同样道理,可以推断出,在严格模式下,构造函数中的this指向构造函数创建的对象实例。

"use strict";//开启严格模式
    function a(){
        var user = "维他奶";
        //在严格模式下,对象的函数中的this指向调用函数的对象实例
        console.log(this);//a{}
        console.log(this.user);//undefined
    }
    var A = new a(); 

运行结果

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

var sum = {
        a:10,
        b:{
            a:12,
            fn:function(){
                console.log(this.a);//12
            }
        }
    }
    sum.b.fn();

运行结果

情况3:如果一个函数中有this,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象.

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

运行结果

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

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

var sum = {
        a1:10,
        b:{
            a:12,
            fn:function(){
                console.log(this.a1);//undefined
                console.log(this);//window
            }
        }
    }
    var num = sum.b.fn;
    num();

运行结果

构造函数的this指向:
function A(){
        this.name = "维他奶";
    }
    var a = new A();
    console.log(a.name);//维他奶

运行结果

new关键字到底做了什么?
(1) 创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);原理:自动调用apply方法,将this指向这个空对象,这样的话函数内部的this就会被这个空的对象替代。
(3) 执行构造函数中的代码(为这个新对象添加属性);
(4) 返回新对象。

return 会把new创建的this覆盖.
如果返回值是复杂数据类型,那么this指向的就是那个返回的对象,如果返回值不是复杂数据类型那么this还是指向函数的实例。

    function A(){
        this.name = "维他奶";
        return 1;
    }
    var a = new A();
    console.log(a.name);//维他奶

    function A(){
        this.name = "维他奶";
        return ;
    }
    var a = new A();
    console.log(a.name);//维他奶

    function A(){
        this.name = "维他奶";
        return function(){};
    }
    var a = new A();
    //传入空函数,所以输出一个空,而不是undefined
    console.log(a.name);//""

    function A(){
        this.name = "维他奶";
        return null;
    }
    var a = new A();
    console.log(a.name);//维他奶

简单数据类型:string,boolean,number,undefined,null,NaN
复杂数据类型: Object,Function,Array,String,Boolean,Number
其中String,Boolean,Number,是自带的封装好的方法。
简单数据类型存放在内存的栈中,而复杂数据类型存放在内存的堆中,把地址存放在内存的栈中,先获取地址,再读取堆中数据。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107847.html

相关文章

  • javascript this学习总结

    摘要:例如通过,调用时强制把它的绑定到上。箭头函数问题箭头函数体内的对象就是定义时所在的对象,而不是使用时所在的对象,固定不变。 刚入门javascript,关于this的学习,花了自己挺多的时间,做了比较多的功课,看了一篇又一篇的文章,也看了一些书籍,今天就结合看的那些东西总结下自己所学到的东西,方便留着以后回看,进一步的学习,这篇文章会不断的更新,不断的更新自己的想法,现在还是一个入门不...

    A Loity 评论0 收藏0
  • 学习JavaScript之this,call,apply

    摘要:在全局对象中调用,自然读取的是全局对象的值构造器调用说明作为构造器调用时,指向返回的这个对象。最直观的表现就是,去看一些优秀框架的源代码时,不再是被绕的晕乎乎的。 学习起因: 在之前的JavaScript学习中,this,call,apply总是让我感到迷惑,但是他们的运用又非常的广泛。遂专门花了一天,来弄懂JavaScript的this,call,apply。中途参考的书籍也很多,以...

    wenhai.he 评论0 收藏0
  • 我对JavaScript中this的一些理解

    摘要:匿名函数的执行环境具有全局性,因此它的对象通常指向。如果对此有疑惑,可以看知乎上的答案知乎匿名函数的指向为什么是作为对象方法的调用,指向该对象当函数作为某个对象的方法调用时,就指这个函数所在的对象。 因为日常工作中经常使用到this,而且在JavaScript中this的指向问题也很容易让人混淆一部分知识。 这段时间翻阅了一些书籍也查阅了网上一些资料然后结合自己的经验,为了能让自...

    focusj 评论0 收藏0
  • JS 中的this指向

    摘要:当碰到时呵呵再看一个呵呵再来呵呵呵呵呵呵呵呵什么意思呢如果返回值是一个对象,那么指向的是构造函数的实例但是并没有被返回,如果返回值不是一个对象那么还是指向构造函数创建的实例。 为什么要学习this?如果你学过面向对象编程,那你肯定知道干什么用的,如果你没有学过,那么暂时可以不用看这篇文章,当然如果你有兴趣也可以看看,毕竟这是js中必须要掌握的东西。 1. this指向调用他的对象 首先...

    KavenFan 评论0 收藏0
  • 再谈JavaScript面向对象思想及继承

    摘要:面向对象中有三大特征,封装,继承,多态。这不仅无法做到数据共享,也是极大的资源浪费,那么引入对象实例对象的属性指向其构造函数,这样看起来实例对象好像继承了对象一样。实例对象的原型指向其构造函数的对象构造器的指向。 前言 为什么说是再谈呢,网上讲解这个的博客的很多,我开始学习也是看过,敲过就没了,自以为理解了就结束了,书到用时方恨少啊。实际开发中一用就打磕巴,于是在重新学习了之后分享出来...

    svtter 评论0 收藏0

发表评论

0条评论

dendoink

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<