学习笔记整理-面向对象-02-认识函数的上下文

一、认识函数的上下文

  • 什么是上下文
      垃圾分类,`这`是非常好的习惯,值得表扬随手关灯,`这`是非常好的习惯,值得表扬遛狗栓绳,`这`是非常好的习惯,值得表扬课后复习,`这`是非常好的习惯,值得表扬 早睡早起,`这`是非常好的习惯,值得表扬
    
  • 函数的上下文
    • 函数中可以使用this关键字,它表示函数的上下文
    • 与中文中"这"类似,函数中的this具体指代什么必须通过调用函数时的"前言后语"来判断
  • 函数中的this
      var xiaoming = {nickname: '小明',age: 12,sayHello: function () {console.log('我是' + this.nickname + ',我' + this.age + '岁了'); }};xiaoming.sayHello(); // 我是小明,我12岁了
    
       var xiaoming = {nickname: '小明',age: 12, sayHello: function () {console.log('我是' + this.nickname + ',我' + this.age + '岁了'); }};var sayHello = xiaoming.sayHello;  // 将函数"提"出来,单独存为变量// 直接圆括号调用这个函数,而不是对象打点调用了sayHello(); // 我是undefined,我undefined岁了
    
  • 函数的上下文由调用方式决定
    • 同一个函数,用不同的形式调用它,则函数的上下文不同
      • 情形1:对象打点调用函数,函数中的this指代这个打点的对象
          xiaoming.sayHello();
        
      • 情形2:圆括号直接调用函数,函数中的this指代window对象
          var sayHello = xiaoming.sayHello; sayHello();
        
          var obj = { a: 1,b: 2,fn: function () {console.log(this.a + this.b);}};var fn = obj.fn;fn();
        

1. 上下文规则1

  • 函数的上下文由调用函数的方式决定

    • 函数的上下文(this关键字)由调用函数的方式决定, function是"运行时上下文"策略。
    • 函数如果不调用,则不能确定函数的上下文。
  • 规则1:对象打点调用它的方法函数,则函数的上下文是这个打点的对象
    对象.方法()

      function fn() {console.log(this.a + this.b);}var obj = { a: 66, b: 33, fn: fn}; obj.fn(); // 99
    
    • 构成对象.方法()的 形式,适用规则1
      var obj1 = {a: 1,b: 2,fn: function () {console.log(this.a + this.b);}};var obj2 = {a: 3,b: 4,fn: obj1.fn };obj2.fn(); // 7
    
    • 构成对象.方法()的形式,适用规则1
       function outer() { var a = 11;var b = 22;return {a: 33,b: 44,fn: function () {console.log(this.a + this.b);}}; }outer().fn(); // 77
    
    • 构成对象.方法()的 形式,适用规则1
      function fun() {console.log(this.a + this.b);}var obj = {a: 1, b: 2, c: [{a: 3, b: 4, c: fun}] };var a = 5; obj.c[0].c(); // 7
    
    • 构成对象.方法()的形式,适用规则1

2. 上下文规则2

  • 规则2:圆括号直接调用函数,则函数的上下文是window对象

      函数()
    
       var obj1 = {a: 1,b: 2,fn: function () {console.log(this.a + this.b);}};var a = 3;var b = 4;var fn = obj1.fn;fn(); // 7
    
    • 构成函数()的形式,适用规则2
      function fun() {return this.a + this.b;}var a = 1; var b = 2;var obj = {a: 3,b: fun(), // 适用规则2fun: fun};var result = obj.fun(); // 适用规则1console.log(result); // 6
    

3. 上下文规则3

  • 规则3:数组(类数组对象)枚举出函数进行调用,上下文 是这个数组(类数组对象)

      数组[下标]()
    
      var arr = ['A', 'B', 'C', function () { console.log(this[0]);}];arr[3](); // "A"
    
    • 适用规则3
  • 什么是类数组对象:所有键名为自然数序列(从0开始),且有length属性的对象。

  • arguments对象是最常见的类数组对象,它是函数的实参列表。

      function fun() {arguments[3](); }fun('A', 'B', 'C', function () { console.log(this[1]); // 'B'});
    
    • 适用规则3

4. 上下文规则4

  • 规则4:IIFE中的函数,上下文是window对象
      (function() {})();
    
      var a = 1;var obj = {a: 2,fun: (function () {var a = this.a;return function () {console.log(a + this.a); // 3} })() // 适用规则4};obj.fun(); // 适用规则1
    

5. 上下文规则5

  • 规则5:定时器、延时器调用函数,上下文是window对象
      setInterval(函数, 时间);setTimeout(函数, 时间);
    
      var obj = {a: 1,b: 2,fun: function () {console.log(this.a + this.b); // 7}}var a = 3; var b = 4;setTimeout(obj.fun, 2000); // 适用规则5
    
      var obj = {a: 1,b: 2,fun: function () {console.log(this.a + this.b); // 3}}var a = 3; var b = 4;setTimeout(function() { obj.fun(); // 适用规则1}, 2000);
    

6. 上下文规则6

  • 规则6:事件处理函数的上下文是绑定事件的DOM元素。
      DOM元素.onclick = function () {};
    
  • 请实现效果:点击哪个盒子,哪个盒子就变红,要求使用同一个事件处理函数实现。
    @code
  • 请实现效果:点击哪个盒子,哪个盒子在2000毫秒后就变红,要求使用同一个事件处理函数实现。
    @code

7. call 和 apply

  • callapply能指定函数的上下文。

      function sum() {alert(this.chinese + this.math + this.english);}var xiaoming = { chinese: 80,math: 95,english: 93};sum.call(xiaoming);sum.apply(xiaoming);
    
    • 函数.call(上下文);
    • 函数.apply(上下文);
  • callapply的区别

      function sum(b1, b2) {alert(this.c + this.m + this.e + b1 + b2);}sum.call(xiaoming, 5, 3); // call要用逗号罗列参数xsum.apply(xiaoming, [5, 3]); // apply要把参数写到数组中
    
  • 到底使用call还是apply?

      function fun1() {fun2.apply(this, arguments);}function fun2(a, b) {alert(a + b);}fun1(33, 44);
    

8. 总结

规则上下文
对象.函数()对象
函数()window
数组[下标]()数组
IIFEwindow
定时器window
DOM事件处理函数绑定DOM的元素
call和apply任意指定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】单链表OJ题(二)

🔥博客主页:小王又困了 📚系列专栏:数据结构 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、链表分割 💡方法一: 二、链表的回文 &#x…

hosts文件中被添加 windows10.microdone.cn

在网上搜了一圈逗说是之前下过征信中心的安全控件,是微通新成网络科技有限公司这家公司提供的,也是http://microdone.cn的运营商。后边只要使用代理,就会跳出来,所以常规处理操作就是去把浏览器上的安全控件卸载了。 参考 解决 windows10 的 代理频繁被自动篡改为windows10.mi…

利用python实现激光雷达LAS数据滤波的7种方式,使用laspy读写

激光雷达(LiDAR)数据在实际应用中可能受到噪声和不完美的测量影响,因此数据去噪和滤波方法变得至关重要,以提高数据质量和准确性。以下是一些常用的激光雷达数据去噪与滤波方法。 原始数据如下: 1. 移动平均滤波&…

kubernetes中PV和PVC

目录 一、PV、PVC简介 二、PV、PVC关系 三、创建静态PV 1.配置nfs存储 2.定义PV 3.定义PVC 4.测试访问 四、 搭建 StorageClass nfs-client-provisioner ,实现 NFS 的动态 PV 创建 1. 配置nfs服务 2.创建 Service Account 3.使用 Deployment 来创建 NFS P…

Figma中文社区来啦,云端协作设计你准备好了吗?

Figma是改变产品设计协作方式的重要工具,但由于没有中文社区,对国内设计师的约束较大。而拥有全中文UI 界面、功能齐全的即时设计资源广场,恰好弥补了Figma的这一短板,它也将取代Figma成为设计师新宠。 1、UI组件集 Figma中文社区替代即时设计资源广场,拥有海量丰富的UI设计组…

【BEV Review】论文 Delving into the Devils of Bird’s-eye-view 2022-9 笔记

背景 一般来说,自动驾驶车辆的视觉传感器(比如摄像头)安装在车身上方或者车内后视镜上。无论哪个位置,摄像头所得到的都是真实世界在透视视图(Perspective View)下的投影(世界坐标系到图像坐标系…

ssm柚子云电子商城java图书购物电子商务管理jsp源代码

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 ssm柚子云电子商城 系统有2权限:前台、后…

SpringBoot笔记:SpringBoot 集成 Dataway 多数据源配置(二)

文章目录 前言核心代码和配置yml 配置注入多数据源常用Spi实现swagger 配置自定义 Udf指定数据源进行查询 前言 之前简单介绍了一下 Dataway 使用,本文继续介绍一下它的多数据源配置和使用。 核心代码和配置 yml 配置 # springboot多环境配置 #端口,…

JavaScript应用:五子棋游戏实战开发

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责…

面试热题(螺旋矩阵)

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素 一看到这个大家有没有想到 就是一个螺旋形状,那这道题我们应该怎么解决? 我们先来仔细的看,它这种螺旋形状的遍历是先【右-下-左-上】…

Docker中Tomcat部署步骤

第一次访问没有东西。

为什么我不推荐任何人用C语言作为编程启蒙第一课?

前言 写了20多年的代码,之前做过阿里的高级架构师,在技术这条路上跌跌撞撞了很多,我今天分享一些我个人的自学方法给各位。为什么我会说:不推荐任何人用C语言作为编程启蒙第一课? 这里有很多同学要站出来说了&#x…

实现CP指令

一、文件的打开创建 #include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags); flags: O_RDONLY 只读 O_WRONLY 只写 O_RDWR 可读可写 int open(const char *pathname, int flags, mode_t mode); 如果 …

VsCode美化 - VsCode自定义 - VsCode自定义背景图

VsCode美化 - VsCode自定义 - VsCode自定义背景图&#xff1a;添加二次元老婆图到VsCode 前言 作为一个二刺螈&#xff0c;VsCode用久了&#xff0c;总觉得少了些什么。是啊&#xff0c;高效的代码生产工具中怎么能没有老婆呢&#xff1f; 那就安装一个VsCode插件把老婆添加…

章节7:Burp Intruder模块

章节7&#xff1a;Burp Intruder模块 参考资料 https://portswigger.net/burp/documentation/desktop/tools/intruder 01 Intruder模块作用与原理 原理 http://xxx.xx.com/bbs/index.php?namewuyanzu&mottogo 对请求参数进行修改&#xff0c;分析响应内容&#xff0…

Linux 内核第一版 (v0.01) 开源代码解读

探索Linux v0.01的内部结构&#xff0c;Linux内核经常被认为是一个庞大的开源软件。在撰写本文时&#xff0c;最新版本是v6.5-rc5&#xff0c;包含36M行代码。不用说&#xff0c;Linux是几十年来许多贡献者辛勤工作的成果。 Linux 内核首个开源版本 (v0.01) 的体积非常小&…

四、Dubbo扩展点加载机制

四、Dubbo扩展点加载机制 4.1 加载机制概述 Dubbo良好的扩展性与框架中针对不同场景使用合适设计模式、加载机制密不可分 Dubbo几乎所有功能组件都是基于扩展机制&#xff08;SPI&#xff09;实现的 Dubbo SPI 没有直接使用 Java SPI&#xff0c;在它思想上进行改进&#xff…

竞赛项目 深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的视频多目标跟踪实现 …

全网最牛,Appium自动化测试框架-关键字驱动+数据驱动实战(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 util 包 util 包…

数据可视化工具LightningChart .NET正式发布v10.5.1——拥有全新的3D新功能

LightningChart.NET完全由GPU加速&#xff0c;并且性能经过优化&#xff0c;可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D&#xff0c;高级3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D饼/甜甜圈&#xff0c;地理地图和GIS图表以及适用于科学…