• this指向详解


    目录

    一:严格模式与非严格模式

    1.严格模式的开启

    2.this指向的一些情况:

    二:如何指定this的值?

    1.在调用时指定this的值

    2.在创建时指定this的值

    ​编辑三: 结尾

    一:严格模式与非严格模式

            在非严格模式下,总是指向一个对象,在严格模式下可以是任意的值。

    1.严格模式的开启

             在我们的日常开发中,所使用的一般都是非严格模式。如果要使用严格模式可以添加 use strict 代码。

            注意:这一行代码不管是写在方法里还是全局,都要写在最上方,可以有注释,但是不能有别的代码。

    2.this指向的一些情况:

    1) 全局执行环境中,指向全局对象(无论是严格模式下还是非严格模式下)

     这里是开启了严格模式的,但是其实非严格模式也是指向的Window

    2) 函数内部,取决于函数被调用的方式

            (1)直接调用的this值

                    非严格模式下:全局对象(window)

                    严格模式下:undefined

    1. // ----函数内部----
    2. // 直接调用-非严格模式
    3. function func(){
    4. console.log(this);
    5. }
    6. // 直接调用--严格模式
    7. function func_script(){
    8. 'use strict'
    9. console.log(this);
    10. }
    11. func()
    12. func_script()

            (2)对象方法调用的this值:调用者(两种模式都是)

    1. //-----3. 对象方法调用 -----
    2. 'use strict'
    3. const person = {
    4. name:'张三',
    5. out(){
    6. console.log(this);
    7. }
    8. }
    9. person.out()

            这里写了严格模式,非严格模式下也是指向的调用者(person)

    二:如何指定this的值?

    1.在调用时指定this的值

            call方法:func.call(thisArg,参数1,参数2....)

            apply方法:func.apply(thisArg,[参数1,参数2....])

    1. // ------1. 调用时指定this的值 ------
    2. function func(numA,numB){
    3. console.log(this);
    4. console.log(numA,numB);
    5. }
    6. const person = {
    7. name:'张三'
    8. }
    9. // 1.1 call方法
    10. func.call(person,1,2)
    11. // 1.2 apply方法-以数组的方式传入参数
    12. func.apply(person,[3,4])

             可以看到,这里的 this 指向被我们主动改变,变成了指向person对象。否则的话,这里的this应当是指向Window。

    2.在创建时指定this的值

             bind方法:const bindFunc = func.bind(thisArg,绑定参数1,绑定参数2....)

            箭头函数:() => {console.log(this)}      注意:这里的this找的是上级函数的this

    1. function func(numA,numB){
    2. console.log(this);
    3. console.log(numA,numB);
    4. }
    5. const person = {
    6. name:'张三'
    7. }
    8. // ------2. 调用时指定this的值 ------
    9. // // 2.1 bind方法
    10. const bindFunc = func.bind(person,'bind方法第一个参数')
    11. bindFunc('第二个参数')
    12. // // 2.2 箭头函数
    13. const food = {
    14. name:'蛋包饭',
    15. eat(){
    16. console.log(this);
    17. //这里是箭头函数,所以是上级作用域的对象,所以是food
    18. setTimeout(() => {
    19. console.log(this);
    20. }, 1000);
    21. // 下面不是箭头函数,所以是全局对象window
    22. // setTimeout(function(){
    23. // console.log(this);
    24. // }, 1000);
    25. }
    26. }
    27. food.eat()

    三: 结尾

            this是开发过程中最为常用的,因此掌握好this的指向,是一个开发工程师所必不可少的,同时可以减少很多莫名其妙的Bug,后续会完善一些call,apply,bind的手写方法,有想法的小伙伴可以一起来学习哦! 

  • 相关阅读:
    SLAM从入门到精通(里程计的计算)
    vue修改node_modules打补丁步骤和注意事项
    R统计绘图-变量分组相关性网络图(igraph)
    Git常见命令
    K8s bridge、ip分配原理
    用栈进行非递归实现前中后遍历二叉树
    A40I工控主板(SBC-X40I)T卡接口,EMMC读写测试
    SpringMVC学习笔记
    Linux学习-45-高级文件系统管理-磁盘配额
    Spring松耦合
  • 原文地址:https://blog.csdn.net/c18559787293/article/details/133934198