最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 关于JS中this指向问题的探究

    正文概述 掘金(请不要耽误我修仙)   2021-04-07   375

    写在前面

    本篇文章的所有例子来源都是《JS设计模式与开发实践》这本书,写这篇文章之前也去查阅了很多关于this指向问题的探讨,包括但不仅仅有像阮一峰老师,还有很多的博主的帖子,还是决定写这篇文章有以下几个原因,第一,加深自己的理解,重新理一遍关于这方面的知识,第二,我尽可能的使用通俗简单的说辞进行解释
    力求让更多的人明白这个东西,第三,this是js中的一个关键字,很有必要单独拿出来写一篇文章。最后一个原因是记录以下拜读这本书的过程!

    js中的this

    this

    this的指向

    如果不考虑常用的with和eval的情况下,具体到实际应用中,this的指向大致可以分为下面四类:

    • 作为对象的方法调用
    • 作为普通函数调用
    • 构造器调用
    • Function.prototype.call 或者 Function.prototype.apply调用
      下面我们一个一个说
    作为对象的方法调用
    var obj = {
            a : 1,
            getA:function () {
                console.info(this === obj) // true
                console.info(this.a)   // 1
            }
        }
        obj.getA()
    
    作为普通函数调用
        window.name = "globalName"
        var getName = function () {
            return this.name
        }
        console.info(getName()) //globalName
    
    • 或者这样写
        window.name = "globalName"
        var obj = {
            name: 'seven',
            getName: function () {
                return this.name
            }
        }
        var getName = obj.getName;
        console.info(getName()) //globalName
    
    window.id = "windows"
        document.getElementById('div1').onclick = function () {
            console.info(this.id) //div1
            var callback = function () {
                console.info(this.id) //windows
            }
            callback()
        }
    
    window.id = "windows"
    document.getElementById('div1').onclick = function () {
            console.info(this.id) //div1
            var that = this;
            var callback = function () {
                console.info(that.id) //div1
            }
            callback()
        }
    
    作为构造器调用
    var myClass = function () {
            this.name = "seven"
        }
        var obj = new myClass()
        console.info(obj.name) //seven
    
    var myClass = function () {
            this.name = "seven"
            return {
                name: "anna"
            }
        }
        var obj = new myClass()
        console.info(obj.name) //anna
    
    Function.prototype.call 或者 Function.prototype.apply调用
    var obj = {
            name : 'seven',
            getName : function () {
            return this.name
            }
        };
        var obj2 = {
            name : 'anna'
        };
        console.info(obj.getName()) //seven
        console.info(obj.getName.call(obj2)) //anna
    
    this丢失的情况
    var obj = {
            myName : 'seven',
            getName : function () {
             return this.myName
            }
        };
        console.info(obj.getName()); //seven
        var getName2 = obj.getName;
        console.info(getName2()) //undefined
    
    • 我们再看一种情况
      var getId = document.getElementById
      getId('div1')
    
    • 修复以后的代码:
    document.getElementById = (function (func) {
            return function () {
                return func.apply(document, arguments)
            }
        })(document.getElementById)
        var getId = document.getElementById
        var div = getId('div1')
        console.info(div.id) //div1
    

    最后

    其实this指向的问题和JS中很多别的不好理解的概念差不多,用的多了就明白了为什么那么写,很多的时候我们看到一个错,就知道需要使用let that = this类似这样的代码块解决,究其原因是他很理解错误的原因吗?其实是见的比较多了罢了,实践出真知,共勉!


    下载网 » 关于JS中this指向问题的探究

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元