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

这篇具有很好参考价值的文章主要介绍了学习笔记整理-面向对象-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(), // 适用规则2
        fun: fun
      };
      var result = obj.fun(); // 适用规则1
      console.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 () {};
    
  • 请实现效果:点击哪个盒子,哪个盒子就变红,要求使用同一个事件处理函数实现。
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
            div{
                width: 200px;
                height: 200px;
                float: left;
                border: 1px solid #000;
                margin-right: 10px;
            }
        </style>
    </head>
    <body>
        <div id="box1"></div>
        <div id="box2"></div>
        <div id="box3"></div>
    
        <script>
            function setColorToRed() {
                this.style.backgroundColor = 'red';
            }
    
            var box1 = document.getElementById('box1');
            var box2 = document.getElementById('box2');
            var box3 = document.getElementById('box3');
    
            box1.onclick = setColorToRed;
            box2.onclick = setColorToRed;
            box3.onclick = setColorToRed;
        </script>
    </body>
    </html>
    
  • 请实现效果:点击哪个盒子,哪个盒子在2000毫秒后就变红,要求使用同一个事件处理函数实现。
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
            div{
                width: 200px;
                height: 200px;
                float: left;
                border: 1px solid #000;
                margin-right: 10px;
            }
        </style>
    </head>
    <body>
        <div id="box1"></div>
        <div id="box2"></div>
        <div id="box3"></div>
    
        <script>
            function setColorToRed() {
                // 备份上下文
                var self = this;
                setTimeout(function() {
                    self.style.backgroundColor = 'red';
                }, 2000);
            }
    
            var box1 = document.getElementById('box1');
            var box2 = document.getElementById('box2');
            var box3 = document.getElementById('box3');
    
            box1.onclick = setColorToRed;
            box2.onclick = setColorToRed;
            box3.onclick = setColorToRed;
        </script>
    </body>
    </html>
    

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要用逗号罗列参数x
      sum.apply(xiaoming, [5, 3]); // apply要把参数写到数组中
    
  • 到底使用call还是apply?文章来源地址https://www.toymoban.com/news/detail-649471.html

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

8. 总结

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

到了这里,关于学习笔记整理-面向对象-02-认识函数的上下文的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习笔记整理-JS-02-基本类型

    1. JavaScript 中两大数据类型 基本数据类型 Number String Boolean Undefined Null 复杂数据类型 Object Array Function RegExp Date Map Set Symbol 等等 typeof 运算法 使用 typeof 运算法可以检测值或者变量的类型 类型名 typeof检测结果 值举例 数字类型 number 5 字符串类型 string ‘张三’ 基本类型值 布尔

    2024年02月13日
    浏览(35)
  • Python笔记2(函数参数、面向对象、装饰器、高级函数、捕获异常、dir)

    Python笔记1(赋值、浅拷贝和深拷贝、字符串日期转换、argparse、sys、overwrite、eval、json.dumps/json.loads、os.system(cmd)、zfill、endswith、open) 参数定义 在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号, 隔开。 定义

    2024年02月08日
    浏览(36)
  • 设计模式学习笔记 - 面向对象 - 1.面向对象到底讨论的是什么

    面向对象编程( OOP )的全称是 Object Oriented Programming 。 面向对象编程语言( OOPL )的全称是 Object Oriented Programming Language 。 面向对象编程中有两个非常重要的概念,就是类( Class )和对象( Object )。面向对象编程这个概念第一次使用是在 SmallTalk 这种编程语言中,它也被认

    2024年02月22日
    浏览(29)
  • Python学习笔记(二十)————面向对象

    (1)面向对象的好处 在日常中,记录数据时往往使用统一的表格,这样就不会使得数据信息格式混乱,同样在程序中的数据组织中,仅仅通过变量来记录会显得混乱不统一。 在程序中是可以做到和生活中那样,设计表格、生产表格、填写表格的组织形式的。 1. 在程序中 设

    2024年02月13日
    浏览(38)
  • Java面向对象学习笔记-4

    当编写Java程序时,了解如何处理异常是至关重要的。异常处理可以帮助我们在程序执行过程中处理各种错误情况,以确保程序能够正常运行或者 graceful 地退出。本文将介绍一些关于Java异常处理的基本概念和最佳实践,包括自定义异常类、用户输入的处理、异常捕获与处理、

    2024年02月09日
    浏览(30)
  • Java学习笔记(三):面向对象

    类(class)和对象(object, 也被称为实例 instance)是 java面向对象的核心,可以把类理解成某种概念,对象理解为一个具体存在的实体。也就是说,日常说的人,其实都是人的实例,而不是人类。 定义类的简单语法: 修饰符可以是 public、final、abstract,或者完全省略。 对一个类而

    2024年02月11日
    浏览(35)
  • Java面向对象学习笔记-3

    本文将介绍Java编程中的一些基本概念和用法,包括类、接口、抽象类、继承、多态和组合等。通过代码示例,我们将深入探讨这些概念,帮助读者更好地理解如何使用Java进行面向对象编程。 Java面向对象学习笔记-1 Java面向对象学习笔记-2 我们首先来看纸张和墨盒类,它们是

    2024年02月09日
    浏览(27)
  • 设计模式学习笔记 - 面向对象 - 3.面向对象比面向过程有哪些优势?面向过程真的过时了吗?

    在过往的工作中,我发现很多人搞不清面向对象和面向过程的区别,总认为使用面向对象编程语言来开发,就是在面向面向对象编程了。而实际上,他们只是在用面向对象编程语言,编写面向过程风格的代码而已,并没有发挥面向对象编程的优势。这就相当于手握一把屠龙刀

    2024年02月22日
    浏览(29)
  • Lua学习笔记:面向对象的实现

    前言 本篇在讲什么 Lua中的面向对象的实现 本篇适合什么 适合 初学Lua 的小白 本篇需要什么 对 Lua 语法有简单认知 依赖 Sublime Text 编辑器 本篇的特色 具有全流程的 图文教学 重实践,轻理论,快速上手 提供全流程的 源码 内容 ★提高阅读体验★ 👉 ♣ 三级标题 👈 👉 ♦

    2024年02月13日
    浏览(32)
  • C#学习笔记--面向对象三大特征

    用程序来抽象现实世界,(万物皆对象)来编程实现功能。 三大特性:封装、继承、多态。 类与对象 声明位置: namespace 中 样式: class 类名{} 命名:帕斯卡命名法(首字母大写) 实例化对象:根据类来新建一个对象。 Person p=new Person(); 成员变量 声明在类语句块中 用来描述

    2024年02月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包