【JavaScript高级】01-this的指向

news/2024/7/5 3:57:02

this的指向

  • this指向
    • this指向分析
    • this的绑定规则
      • 默认绑定
      • 隐式绑定
      • new绑定
      • 显示绑定
    • this绑定优先级
    • this规则之外的情况
      • 3. `箭头函数 arrow function`(掌握)

this指向

先对在“this指向”中的三种情况进行回顾,下边在深入了解

在这里插入图片描述

this指向分析

如下定义一个函数时,采用三种不同的方式进行调用,产生不同的结果

在这里插入图片描述

在这里插入图片描述
说明:

  1. 说明函数在调用时,JavaScript会默认给this绑定一个值
  2. this的绑定和定义的位置(编写的位置)没有关系
  3. this的绑定调用方式及调用位置有关
  4. this是在运行时被绑定

this的绑定规则

默认绑定

  1. 普通函数被独立的调用:指向window独立的函数调用可以理解成函数没有被绑定到某个对象上进行调用
  2. 函数在对象中,但是独立调用:指向window
  3. 严格模式下,独立调用的函数指向undefined
    在这里插入图片描述

隐式绑定

通过某个对象进行调用时,this指向调用它的对象

在这里插入图片描述

new绑定

在这里插入图片描述

显示绑定

在这里插入图片描述

显示绑定call,apply用法示例

 <script>
        function fn (){
            console.log("fn函数:",this);
        }

        var obj = {
            unmae:'kk'
        }

    // 需求:要求执行函数且this指向obj
    // 1.给对象中添加方法,使用对象进行调用
        // obj.fn = fn;
        // obj.fn();

    // 2.显示绑定
    //执行函数,并且强制this就是obj对象
    // fn.apply(obj);
    fn.call(obj);
    fn.call(123);
    fn.call(undefined);
    fn.call('dwad');
   
    </script>

打印结果

在这里插入图片描述

call和apply区别代码示例:

 <script>
        function fn(name, age, height){
            console.log("fn函数被调用:",this);
            console.log("打印参数:", name, age, height );
        }

        // ()调用
        fn("kkk", 18, 172);
        
        // apply
        // 第一个参数:绑定this
        // 第二个参数:传递额外的实参,以数组的形式
        fn.apply("apply", ["yyy", 19, 185]);

        // call
        // 第一个参数:绑定this
        // 参数列表:后续的参数以多参数的形式进行传递,会作为实参
        fn.call("call","kobe",35,195);
    </script>

打印结果

在这里插入图片描述

在这里插入图片描述

bind(少用)
在这里插入图片描述
在上述bind用法示例1中,bar()明显为独立函数调用,但却因为绑定了bind而不指向window了,这就涉及到了this绑定的优先级

this绑定优先级

在这里插入图片描述
显示绑定间,bind优先级高于apply/call

代码测试:

 <script>
        function fn (){
            console.log("fn:", this);
        }

    // 比较优先级:

    // 1.显式绑定的优先级高于隐式绑定
        // -测试一:apply高于隐式绑定
    // var obj = {
    //     foo:fn
    // }
    // obj.foo.apply("abc");//abc

        // -测试二:bind优先级高于隐式绑定
        // var qbz = fn.bind("aaa");
        // var obj = {
        //     name: "sevgilid",
        //     bar: qbz
        // }
        // obj.bar();//aaa

    // 2.new绑定优先级高于隐式绑定
        // var obj = {
        //     name:"sevgilid",
        //     foo:function(){
        //         console.log("foo:", this);
        //     }
        // }
        // new obj.foo();//foo: foo {}

    // 3. new和显式绑定优先级
        //一: new不能喝apply/call一起使用
        // 二:new优先级高于bind
        // var bindFn = fn.bind("aaa");
        // new bindFn();//fn: fn {}

    // 4.bind和allpy/call的优先级
        // bind高于apply和call
        var bindFn = fn.bind("aaa");
        bindFn.apply("bbb");//fn: String {'aaa'}
    </script>

this规则之外的情况

  1. 如果在显示绑定中,我们传入一个null或者undefined,那么这个显示绑定会被忽略,使用默认规则;(了解)
    在这里插入图片描述
  2. 创建一个函数的间接引用,这种情况使用默认绑定规则。(了解)

指向window
在这里插入图片描述

3. 箭头函数 arrow function(掌握)

在这里插入图片描述

一、 用法示例:

<script>
    // 和常规函数对比示例
        setTimeout(function(){
            console.log(222);
        },3000);

        setTimeout(() => {
            console.log(1);
        }, 3000);
    </script>

箭头函数的完整写法和练习:

在这里插入图片描述
二、编写优化(简写)
在这里插入图片描述

代码示例

<script>
        // 1.优化一:如果箭头函数只有一个参数,那么()可以省略
        var names = ["dfa","ads","xxx"];
        var nums = [1,333,222];
        // names.forEach(item => {console.log(item)});
        // var newNums = nums.filter(item=>{
        //     return item % 2 ===0
        // })

        // 2.优化二:如果函数体中只有一行代码,则{}可以省略
        names.forEach(item => console.log(item));
        // 一行代码中不能带return关键字。如果胜率需要带return一起省略(下一条规则)
        // var newNums = nums.filter(item => {
        //     return item %2 ===0
        // })

        // // 3.优化三:只有一行代码时,这行代码的表达式结果会作为函数的返回值默认返回的
        // 原写法
        // var newNums = nums.filter(function(item){
        //     return item%2 === 0
        // })

        var newNums = nums.filter(item => item %2 === 0)
    </script>

箭头函数中的this使用(掌握)

  • 箭头函数中没有this,所以没有绑定,使用时按查找规则判断 箭头函数中
  • 箭头函数中this的查找规则

在这里插入图片描述


http://lihuaxi.xjx100.cn/news/142005.html

相关文章

nodejs,vue,element 这三者是什么关系?

有网友提问说&#xff1a; 标题&#xff1a;nodejs,vue,element 这三者是什么关系&#xff1f; 描述: 软件工程刚毕业萌新一枚&#xff0c;最近公司在做项目&#xff0c;前端用的是这三个技术&#xff0c;由于之前只学过jsp和html&#xff0c;所以实在搞不懂这三者的关系&#…

MySQL的select语句

SQL概述 SQL背景知识 1946 年&#xff0c;世界上第一台电脑诞生&#xff0c;如今&#xff0c;借由这台电脑发展起来的互联网已经自成江湖。在这几十年里&#xff0c;无数的技术、产业在这片江湖里沉浮&#xff0c;有的方兴未艾&#xff0c;有的已经几幕兴衰。但在这片浩荡的波…

力扣刷题day41|198打家劫舍、213打家劫舍II、337打家劫舍III

文章目录198. 打家劫舍思路动态规划五部曲213. 打家劫舍II思路难点337. 打家劫舍 III暴力递归思路记忆化递推思路动态规划思路递归三部曲动规五部曲198. 打家劫舍 力扣题目链接 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响…

[附源码]计算机毕业设计JAVAjsp茶园认养管理平台

[附源码]计算机毕业设计JAVAjsp茶园认养管理平台 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM myb…

[附源码]计算机毕业设计JAVAjsp宾馆客房管理系统

[附源码]计算机毕业设计JAVAjsp宾馆客房管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM myb…

Java基础3(操作数组的工具类(java.util.Arrays),java数组中的常见异常)

1、操作数组的工具类&#xff08;java.util.Arrays&#xff09; package com.wm.lianxi; import java.util.Arrays; public class ArrayTest3 { //操作数组的工具类。 public static void main(String[] args) { //1、boolen equals(int[]a,int[]b);判…

运动控制器位置锁存功能的应用

今天&#xff0c;正运动小助手给大家分享一下运动控制器位置锁存功能的应用&#xff0c;以ZMC408CE运动控制器为例&#xff0c;介绍多种锁存模式的用法&#xff0c;用户可根据自身需求灵活选择。 01 锁存功能 锁存功能的作用就是当外部io信号触发时&#xff0c;立即响应&…

【Spring boot 全局异常捕捉】

Spring boot 全局异常捕捉 在一个项目中的异常我们我们都会统一进行处理的&#xff0c;那么如何进行统一进行处理呢&#xff1f; 新建一个类 GlobalDefaultExceptionHandler&#xff0c; 在 class 注解上ControllerAdvice, CONTROLLERADVICE&#xff1a;即把CONTROLLERADVICE 注…