首页 > 其他分享 >JS 探索 this 指向问题

JS 探索 this 指向问题

时间:2022-11-04 12:15:15浏览次数:78  
标签:obj 调用者 探索 getInfo bind JS call var 指向

1. 扑朔迷离的 this

  1. 从表面来看,this 总能通过各种变通的方式得到意想不到的结果

  2. 既然是“意想不到”,就说明对“各种变通的方式”不太了解

2. 那么我们来看看“各种变通的方式”

  1. 老早以前,this 指向它的调用者
     1 <script>
     2     // 通过 dom 调用
     3     var _html = document.documentElement;
     4     _html.onclick = function () {
     5         console.log("this === _html", this === _html); // true
     6     };
     7 
     8     // 通过 obj 调用
     9     var _obj = {
    10         getInfo: function () {
    11             console.log("this === _obj", this === _obj); // true
    12         },
    13     };
    14     _obj.getInfo();
    15 
    16     // 直接调用
    17     function getInfo() {
    18         console.log("this === window", this === window); // true
    19     }
    20     getInfo();
    21 </script>
  2. 后来遇到了面试官,学会了 bind
     1 <script>
     2     // 预定义一个 dom 和 handle
     3     var _html = document.documentElement;
     4     function handle() {
     5         console.log(this);
     6     }
     7 
     8     // 预定义调用者
     9     var _num = 1;
    10     var _obj = {};
    11     var _nul = null;
    12 
    13     // 使用 bind 绑定
    14     var _numHandle = handle.bind(_num);
    15     var _objHandle = handle.bind(_obj);
    16     var _nulHandle = handle.bind(_nul);
    17 
    18     // 都执行一遍
    19     _html.addEventListener("click", _numHandle); // Number {1}
    20     _html.addEventListener("click", _objHandle); // {}
    21     _html.addEventListener("click", _nulHandle); // Window {…}
    22 </script>
  3. 后来发现,如果独立调用一个函数,使用 bind 太麻烦了,学会了 call,apply,我下面用 call
     1 <script>
     2     function getInfo() {
     3         console.log(this);
     4     }
     5 
     6     // 预定义调用者
     7     var _num = 1;
     8     var _obj = {};
     9     var _nul = null;
    10 
    11     // 用 call 调用
    12     getInfo.call(_num); // Number {1}
    13     getInfo.call(_obj); // {}
    14     getInfo.call(_nul); // Window {…}
    15 </script>
  4. 可以看到 [call, apply, bind] 绑定 this 的时候对参数做了处理,如果是 null,就绑定 Window;如果是简单数据类型,就用 Object 包裹一下

3. 通过“各种变通的方式”做一个推理

  1. this 本来指向它的调用者
  2. 通过 [call, apply, bind] 可以改变 this 指向
  3. 有没有可能是改变了了“调用者”,所以 this 指向了新的“调用者”
  4. 这里是我的另一篇文章,手动实现 [call, apply, bind],它的实现方式就是改变“调用者”
  5. 可以尝试手动实现箭头函数

4. 结论

  1. this 指向调用者
  2. 改变 this 指向的方式是改变调用者
  3. 一路走来,真是返璞归真啊^O^

标签:obj,调用者,探索,getInfo,bind,JS,call,var,指向
From: https://www.cnblogs.com/aurora-power/p/16857309.html

相关文章

  • js 密码强度检测工具
    效果:  新建一个密码强度检测工具文件 password-strength.js://hasnumberconsthasNumber=(number)=>newRegExp(/[0-9]/).test(number);//hasmixofs......
  • download.js (实例3)下载
     downloadFile(url,"电子作业票APP.jpg");//fileRealPath文件全路径//fileName文件名带格式的exportfunctiondownloadFile(fileRealPath,fileName){l......
  • JS书写规范
    JS变量命名命名方法小驼峰式命名命名规范前缀应当是名词。(函数的名字前缀为动词,以此区分变量和函数)命名建议尽量在变量名字中体现所属类型,如:length、count等表示......
  • download.js (实例2)下载
    调用this.$download.url('/api/v1/org/question/exportData',datVal,`${this.questMess.name}.xlsx`);js文件import{saveAs}from'file-saver'importaxi......
  • el-dialog 或dialog 封装 通过js控制
    1.通用组件封装dialogImg.vue<template><div><el-dialogv-show="isShow":visible.sync="isShow"width="50%"@close="seePicUrl='......
  • ArcGIS JS API 添加要素图层 点击时获取图层属性
    //需要引入:"esri/layers/FeatureLayer"模块//要素图层被点击时弹出图层属性的模板定义{为字段}varTuCeng03TC={"title":"ID:{objectid}",......
  • Vue、Three.js实现全景图
    一、首先我们需要创建一个Vue工程本文主要详细记录搭建全景图的过程,故搭建Vue工程不在过多描述。二、安装Three.jsnpminstallthree--savenpminstallthree-trackba......
  • JSON
    数据交换格式1、什么是数据交换格式数据交换格式,就是服务器端与客户端之间进行数据传输与交换的格式。前段领域,经常提及的两种数据交换格式分别是XML和JSON。其中......
  • js踩坑记录-数组
    数组比较eg1:以为打印出的是true,但是是false,原因是数组是引用数据类型,比较的时候比较的是地址,所以是不相等的。在C++中,数组也是不能通过这种方式比较的。但是python是可以......
  • 2022-11-04 js foreach 三重循环
    letarr=[];req.data.forEach((e,k1)=>{letobj={};obj.value=e.content;obj.children=[];obj.expand=false;if(e.children){e.child......