• this指向问题(1)


    在JS中,this一般有四种绑定的方式,但是在确定到底是哪种绑定之前必须先找到函数的调用位置。接下来先介绍其中的三种:

    1、默认绑定

      其实所谓的默认绑定就是函数直接调用(前面没有什么东西来点它),在默认绑定的非严格模式中,this 指向 window 

    function test(){
            console.log(a)  // 1
        }
    var a = 1
    test()

    在这个地方可能会有人想问,如果是在另一个函数 foo 中调用函数 test 呢 ? 其实 this 指向的还是 window 。可以这样想  

    test()=window.test()

    2、隐士绑定

      故名思意“你没有看到在哪绑定的”,在这里要考虑的是调用的位置有没有上下文对象,或者是被对象包含之类的

    function test(){
            console.log(this.a)
    }
    var obj = {
        a:1,
        text:test
    }
    test()  // undefined
    obj.text()   // 1

    在这个地方可能有人会想不通了。为什么 obj.text() 之后执行的确实函数 test ,其实在这个地方 属性 text 里面放的是函数 test 的引用。在这因为函数调用的上下文对象是 obj ,所以this 指向了 obj。如果有很多层引用,那么this 就是指向最后一个

    var b = obj.text
    var a = 2
    b() // 2

    在这个地方 b 其实是拿到了函数 test 的引用,所以还是遵循默认绑定。还有一个值得一提的地方是:向函数传递参数其实是一种隐形赋值,感兴趣的可以去试试

    3、new 绑定

      说到 new 了解过 Java 的人应该都知道,但是 JS 中的 new 和 Java 中的不是一个东西。

    new 的作用:

          1、构建一个全新的对象(注意是全新)

          2、新对象会绑定到函数调用的 this

          3、如果 new 的这个函数没有返回对象,那么new之后就会自动返回这个对象

            function test(a){
                console.log(this)   // test{}
                this.a=a
                console.log(this)   // test{a:2}
    
            }
            console.log(test) // f test(){}
            var b = new test(2)
            console.log(b.a)  //2

    其实还可以在 test 函数里面返回一个对象,那样在 b 里面保存的就是这个返回对象

    在这里涉及到了原型链就不讲了,等后面专门挑个时间好好写写原型链

    其实关于 this 还有 call、apply、bind、箭头函数可写,但是在这就不写了。这个礼拜好好梳理一下这些东西,然后再分享出来,顺便会写到优先级的问题。

    第一次写,不喜欢勿喷,如果有什么问题可以留言。我学JS是也从别人那学了很多东西,所以现在把我知道的分享出来,共同进步。2018年加油吧

  • 相关阅读:
    C++ 什么是多态
    *和&的使用
    静态链接库与动态链接库
    利尔达CC3200模块烧写程序笔记
    创龙TMS320C6748开发找不到 tl.dsp.evm6748的问题研究
    RTSC和XDCTool的理解
    创龙DSP6748开发板SYS/BIOS的LED闪烁-第2篇
    Coap协议学习笔记-第一篇
    linux进程的学习笔记(未完)
    创龙DSP6748开发板LED闪烁-第一篇
  • 原文地址:https://www.cnblogs.com/lan1974/p/8167922.html
Copyright © 2020-2023  润新知